public static MeasureType<?> create(String funcName, String dataType) { return create(funcName, DataType.getType(dataType)); }
private static void registerUDAF(MeasureTypeFactory<?> factory) { MeasureType<?> type = factory.createMeasureType(factory.getAggrFunctionName(), DataType.getType(factory.getAggrDataTypeName())); Map<String, Class<?>> udafs = type.getRewriteCalciteAggrFunctions(); if (type.needRewrite() == false || udafs == null) return; for (String udaf : udafs.keySet()) { udaf = udaf.toUpperCase(Locale.ROOT); if (udaf.equals(FunctionDesc.FUNC_COUNT_DISTINCT)) continue; // skip built-in function if (udafFactories.containsKey(udaf)) throw new IllegalStateException( "UDAF '" + udaf + "' was dup declared by " + udafFactories.get(udaf) + " and " + factory); udafFactories.put(udaf, factory); udafMap.put(udaf, udafs.get(udaf)); } }
String funcName = factory.getAggrFunctionName(); if (!funcName.equals(funcName.toUpperCase(Locale.ROOT))) throw new IllegalArgumentException( "Aggregation function name '" + funcName + "' must be in upper case"); String dataTypeName = factory.getAggrDataTypeName(); if (!dataTypeName.equals(dataTypeName.toLowerCase(Locale.ROOT))) throw new IllegalArgumentException( "Aggregation data type name '" + dataTypeName + "' must be in lower case"); Class<? extends DataTypeSerializer<?>> serializer = factory.getAggrDataTypeSerializer(); registerUDAF(factory); List<MeasureTypeFactory<?>> list = factories.get(funcName); if (list == null)
public static MeasureType<?> create(String funcName, DataType dataType) { funcName = funcName.toUpperCase(Locale.ROOT); List<MeasureTypeFactory<?>> factory = factories.get(funcName); if (factory == null) factory = defaultFactory; // a special case where in early stage of sql parsing, the data type is unknown; only needRewrite() is required at that stage if (dataType == null) { return new NeedRewriteOnlyMeasureType(funcName, factory); } // the normal case, only one factory for a function if (factory.size() == 1) { return factory.get(0).createMeasureType(funcName, dataType); } // sometimes multiple factories are registered for the same function, then data types must tell them apart for (MeasureTypeFactory<?> f : factory) { if (f.getAggrDataTypeName().equals(dataType.getName())) return f.createMeasureType(funcName, dataType); } throw new IllegalStateException( "failed to create MeasureType with funcName: " + funcName + ", dataType: " + dataType); }
String funcName = factory.getAggrFunctionName(); if (funcName.equals(funcName.toUpperCase()) == false) throw new IllegalArgumentException("Aggregation function name '" + funcName + "' must be in upper case"); String dataTypeName = factory.getAggrDataTypeName(); if (dataTypeName.equals(dataTypeName.toLowerCase()) == false) throw new IllegalArgumentException("Aggregation data type name '" + dataTypeName + "' must be in lower case"); Class<? extends DataTypeSerializer<?>> serializer = factory.getAggrDataTypeSerializer();
private void reInitMeasureType() { if (isDimensionAsMetric && isCountDistinct()) { // create DimCountDis measureType = MeasureTypeFactory.createNoRewriteFieldsMeasureType(getExpression(), getReturnDataType()); returnDataType = DataType.getType("dim_dc"); } else { measureType = MeasureTypeFactory.create(getExpression(), getReturnDataType()); } }
public NeedRewriteOnlyMeasureType(String funcName, List<MeasureTypeFactory<?>> factory) { for (MeasureTypeFactory<?> f : factory) { boolean b = f.createMeasureType(funcName, null).needRewrite(); if (needRewrite == null) needRewrite = Boolean.valueOf(b); else if (needRewrite.booleanValue() != b) throw new IllegalStateException( "needRewrite() of factorys " + factory + " does not have consensus"); } }
private static void createOLAPSchemaFunctions(Map<String, String> definedUdfs, StringBuilder out) throws IOException { Map<String, String> udfs = Maps.newHashMap(); if (definedUdfs != null) udfs.putAll(definedUdfs); for (Entry<String, Class<?>> entry : MeasureTypeFactory.getUDAFs().entrySet()) { udfs.put(entry.getKey(), entry.getValue().getName()); } int index = 0; out.append(" \"functions\": [\n"); for (Map.Entry<String, String> udf : udfs.entrySet()) { String udfName = udf.getKey().trim().toUpperCase(Locale.ROOT); String udfClassName = udf.getValue().trim(); out.append(" {\n"); out.append(" name: '" + udfName + "',\n"); out.append(" className: '" + udfClassName + "'\n"); if (index < udfs.size() - 1) { out.append(" },\n"); } else { out.append(" }\n"); } index++; } out.append(" ]\n"); } }
private void reInitMeasureType() { if (isDimensionAsMetric && isCountDistinct()) { // create DimCountDis measureType = MeasureTypeFactory.createNoRewriteFieldsMeasureType(getExpression(), getReturnDataType()); returnDataType = DataType.getType("dim_dc"); } else { measureType = MeasureTypeFactory.create(getExpression(), getReturnDataType()); } }
public static MeasureType<?> create(String funcName, DataType dataType) { funcName = funcName.toUpperCase(Locale.ROOT); List<MeasureTypeFactory<?>> factory = factories.get(funcName); if (factory == null) factory = defaultFactory; // a special case where in early stage of sql parsing, the data type is unknown; only needRewrite() is required at that stage if (dataType == null) { return new NeedRewriteOnlyMeasureType(funcName, factory); } // the normal case, only one factory for a function if (factory.size() == 1) { return factory.get(0).createMeasureType(funcName, dataType); } // sometimes multiple factories are registered for the same function, then data types must tell them apart for (MeasureTypeFactory<?> f : factory) { if (f.getAggrDataTypeName().equals(dataType.getName())) return f.createMeasureType(funcName, dataType); } throw new IllegalStateException( "failed to create MeasureType with funcName: " + funcName + ", dataType: " + dataType); }
public NeedRewriteOnlyMeasureType(String funcName, List<MeasureTypeFactory<?>> factory) { for (MeasureTypeFactory<?> f : factory) { boolean b = f.createMeasureType(funcName, null).needRewrite(); if (needRewrite == null) needRewrite = Boolean.valueOf(b); else if (needRewrite.booleanValue() != b) throw new IllegalStateException( "needRewrite() of factorys " + factory + " does not have consensus"); } }
private static void createOLAPSchemaFunctions(Map<String, String> definedUdfs, StringBuilder out) throws IOException { Map<String, String> udfs = Maps.newHashMap(); if (definedUdfs != null) udfs.putAll(definedUdfs); for (Entry<String, Class<?>> entry : MeasureTypeFactory.getUDAFs().entrySet()) { udfs.put(entry.getKey(), entry.getValue().getName()); } int index = 0; out.append(" \"functions\": [\n"); for (Map.Entry<String, String> udf : udfs.entrySet()) { String udfName = udf.getKey().trim().toUpperCase(Locale.ROOT); String udfClassName = udf.getValue().trim(); out.append(" {\n"); out.append(" name: '" + udfName + "',\n"); out.append(" className: '" + udfClassName + "'\n"); if (index < udfs.size() - 1) { out.append(" },\n"); } else { out.append(" }\n"); } index++; } out.append(" ]\n"); } }
public static MeasureAggregator<?> create(String funcName, DataType dataType) { return MeasureTypeFactory.create(funcName, dataType).newAggregator(); }
String funcName = factory.getAggrFunctionName(); if (!funcName.equals(funcName.toUpperCase(Locale.ROOT))) throw new IllegalArgumentException( "Aggregation function name '" + funcName + "' must be in upper case"); String dataTypeName = factory.getAggrDataTypeName(); if (!dataTypeName.equals(dataTypeName.toLowerCase(Locale.ROOT))) throw new IllegalArgumentException( "Aggregation data type name '" + dataTypeName + "' must be in lower case"); Class<? extends DataTypeSerializer<?>> serializer = factory.getAggrDataTypeSerializer(); registerUDAF(factory); List<MeasureTypeFactory<?>> list = factories.get(funcName); if (list == null)
private static void registerUDAF(MeasureTypeFactory<?> factory) { MeasureType<?> type = factory.createMeasureType(factory.getAggrFunctionName(), DataType.getType(factory.getAggrDataTypeName())); Map<String, Class<?>> udafs = type.getRewriteCalciteAggrFunctions(); if (type.needRewrite() == false || udafs == null) return; for (String udaf : udafs.keySet()) { udaf = udaf.toUpperCase(Locale.ROOT); if (udaf.equals(FunctionDesc.FUNC_COUNT_DISTINCT)) continue; // skip built-in function if (udafFactories.containsKey(udaf)) throw new IllegalStateException( "UDAF '" + udaf + "' was dup declared by " + udafFactories.get(udaf) + " and " + factory); udafFactories.put(udaf, factory); udafMap.put(udaf, udafs.get(udaf)); } }
public static MeasureType<?> create(String funcName, DataType dataType) { funcName = funcName.toUpperCase(); List<MeasureTypeFactory<?>> factory = factories.get(funcName); if (factory == null) factory = defaultFactory; // a special case where in early stage of sql parsing, the data type is unknown; only needRewrite() is required at that stage if (dataType == null) { return new NeedRewriteOnlyMeasureType(funcName, factory); } // the normal case, only one factory for a function if (factory.size() == 1) { return factory.get(0).createMeasureType(funcName, dataType); } // sometimes multiple factories are registered for the same function, then data types must tell them apart for (MeasureTypeFactory<?> f : factory) { if (f.getAggrDataTypeName().equals(dataType.getName())) return f.createMeasureType(funcName, dataType); } throw new IllegalStateException(); };
public NeedRewriteOnlyMeasureType(String funcName, List<MeasureTypeFactory<?>> factory) { for (MeasureTypeFactory<?> f : factory) { boolean b = f.createMeasureType(funcName, null).needRewrite(); if (needRewrite == null) needRewrite = Boolean.valueOf(b); else if (needRewrite.booleanValue() != b) throw new IllegalStateException("needRewrite() of factorys " + factory + " does not have consensus"); } }
@BeforeClass public static void setUp() throws Exception { staticCreateTestMetadata(); measureType = (MeasureType<ByteArray>) MeasureTypeFactory.create("EXTENDED_COLUMN", "extendedcolumn(20)"); }
@Test public void test() { CubeDesc desc = CubeDescManager.getInstance(getTestConfig()).getCubeDesc("test_kylin_cube_without_slr_left_join_desc"); MeasureDesc topSellerMeasure = null; for (MeasureDesc measureDesc : desc.getMeasures()) { if (measureDesc.getName().equals("TOP_SELLER")) { topSellerMeasure = measureDesc; break; } } TopNMeasureType measureType = (TopNMeasureType) MeasureTypeFactory.create(topSellerMeasure.getFunction().getExpression(), topSellerMeasure.getFunction().getReturnDataType()); topSellerMeasure.getFunction().getConfiguration().clear(); List<TblColRef> colsNeedDict = measureType.getColumnsNeedDictionary(topSellerMeasure.getFunction()); assertTrue(colsNeedDict != null && colsNeedDict.size() == 1); TblColRef sellerColRef = topSellerMeasure.getFunction().getParameter().getColRefs().get(1); topSellerMeasure.getFunction().getConfiguration().put(TopNMeasureType.CONFIG_ENCODING_PREFIX + sellerColRef.getIdentity(), "int:6"); colsNeedDict = measureType.getColumnsNeedDictionary(topSellerMeasure.getFunction()); assertTrue(colsNeedDict.size() == 0); } }
@Test public void testIngest() { MeasureType<HLLCounter> mtype = (MeasureType<HLLCounter>) MeasureTypeFactory.create(HLLCMeasureType.FUNC_COUNT_DISTINCT, DataType.getType("hllc(10)")); MeasureIngester<HLLCounter> ingester = mtype.newIngester(); HLLCounter hllc; hllc = ingester.valueOf(new String[] { null }, null, null); assertEquals(0, hllc.getCountEstimate()); hllc = ingester.valueOf(new String[] { null, null }, null, null); assertEquals(0, hllc.getCountEstimate()); hllc = ingester.valueOf(new String[] { "" }, null, null); assertEquals(1, hllc.getCountEstimate()); hllc = ingester.valueOf(new String[] { "", null }, null, null); assertEquals(1, hllc.getCountEstimate()); hllc = ingester.valueOf(new String[] { "abc" }, null, null); assertEquals(1, hllc.getCountEstimate()); } }