public static List<TblColRef> getExtendedColumnHosts(FunctionDesc functionDesc) { List<TblColRef> ret = Lists.newArrayList(); List<TblColRef> params = functionDesc.getParameter().getColRefs(); for (int i = 0; i < params.size() - 1; i++) { ret.add(params.get(i)); } return ret; }
public void init(DataModelDesc model) { expression = expression.toUpperCase(Locale.ROOT); if (expression.equals(PercentileMeasureType.FUNC_PERCENTILE)) { expression = PercentileMeasureType.FUNC_PERCENTILE_APPROX; // for backward compatibility } returnDataType = DataType.getType(returnType); for (ParameterDesc p = parameter; p != null; p = p.getNextParameter()) { if (p.isColumnType()) { TblColRef colRef = model.findColumn(p.getValue()); p.setValue(colRef.getIdentity()); p.setColRef(colRef); } } }
@Override public void adjustSqlDigest(List<MeasureDesc> measureDescs, SQLDigest sqlDigest) { if (sqlDigest.isRawQuery) { for (MeasureDesc measureDesc : measureDescs) { if (!sqlDigest.involvedMeasure.contains(measureDesc)) { continue; } TblColRef col = this.getRawColumn(measureDesc.getFunction()); ParameterDesc colParameter = ParameterDesc.newInstance(col); FunctionDesc rawFunc = FunctionDesc.newInstance("RAW", colParameter, null); if (sqlDigest.allColumns.contains(col)) { if (measureDesc.getFunction().equals(rawFunc)) { FunctionDesc sumFunc = FunctionDesc.newInstance("SUM", colParameter, null); sqlDigest.aggregations.remove(sumFunc); sqlDigest.aggregations.add(rawFunc); logger.info("Add RAW measure on column " + col); } if (!sqlDigest.metricColumns.contains(col)) { sqlDigest.metricColumns.add(col); } } } } }
public List<TblColRef> getColRefs() { if (allColRefsIncludingNexts == null) { List<TblColRef> all = new ArrayList<>(2); ParameterDesc p = this; while (p != null) { if (p.isColumnType()) all.add(p.getColRef()); p = p.nextParameter; } allColRefsIncludingNexts = all; } return allColRefsIncludingNexts; }
@Override public String toString() { String thisStr = isColumnType() ? colRef.toString() : value; return nextParameter == null ? thisStr : thisStr + "," + nextParameter.toString(); }
public static MeasureDesc getMeasureMax(String column, String dataType) { ParameterDesc parameterDesc = new ParameterDesc(); parameterDesc.setValue(column); parameterDesc.setType(FunctionDesc.PARAMETER_TYPE_COLUMN); FunctionDesc function = new FunctionDesc(); function.setExpression(FunctionDesc.FUNC_MAX); function.setParameter(parameterDesc); function.setReturnType(dataType); MeasureDesc result = new MeasureDesc(); result.setName(column + "_MAX"); result.setFunction(function); return result; }
private List<TblColRef> getTopNLiteralColumn(FunctionDesc functionDesc) { List<TblColRef> allColumns = functionDesc.getParameter().getColRefs(); if (functionDesc.getParameter().isColumnType() == false) { return allColumns; } return allColumns.subList(1, allColumns.size()); }
/** * * @param hllType represents the presision */ private MeasureDesc makeHLLMeasure(ColumnDesc columnDesc, String hllType) { String columnName = columnDesc.getName(); MeasureDesc measureDesc = new MeasureDesc(); FunctionDesc f1 = new FunctionDesc(); f1.setExpression("COUNT_DISTINCT"); ParameterDesc p1 = new ParameterDesc(); p1.setType("column"); p1.setValue(columnName); p1.setColRefs(ImmutableList.of(new TblColRef(columnDesc))); f1.setParameter(p1); f1.setReturnType(hllType); measureDesc.setFunction(f1); return measureDesc; }
public String[] buildValueOf(int idxOfMeasure, String[] row) { MeasureDesc measure = cubeDesc.getMeasures().get(idxOfMeasure); FunctionDesc function = measure.getFunction(); int[] colIdxOnFlatTable = flatDesc.getMeasureColumnIndexes()[idxOfMeasure]; int paramCount = function.getParameterCount(); List<String> inputToMeasure = Lists.newArrayListWithExpectedSize(paramCount); // pick up parameter values ParameterDesc param = function.getParameter(); int colParamIdx = 0; // index among parameters of column type for (int i = 0; i < paramCount; i++, param = param.getNextParameter()) { String value; if (function.isCount()) { value = "1"; } else if (param.isColumnType()) { value = getCell(colIdxOnFlatTable[colParamIdx++], row); } else { value = param.getValue(); } inputToMeasure.add(value); } return inputToMeasure.toArray(new String[inputToMeasure.size()]); } }
private void initMeasureColumns(Map<String, TableDesc> tables) { if (measures == null || measures.isEmpty()) { return; } TableDesc factTable = tables.get(getFactTable()); for (MeasureDesc m : measures) { m.setName(m.getName().toUpperCase()); if (m.getDependentMeasureRef() != null) { m.setDependentMeasureRef(m.getDependentMeasureRef().toUpperCase()); } FunctionDesc f = m.getFunction(); f.setExpression(f.getExpression().toUpperCase()); f.initReturnDataType(); for (ParameterDesc p = f.getParameter(); p != null; p = p.getNextParameter()) { p.setValue(p.getValue().toUpperCase()); } ArrayList<TblColRef> colRefs = Lists.newArrayList(); for (ParameterDesc p = f.getParameter(); p != null; p = p.getNextParameter()) { if (p.isColumnType()) { ColumnDesc sourceColumn = factTable.findColumnByName(p.getValue()); TblColRef colRef = new TblColRef(sourceColumn); colRefs.add(colRef); allColumns.add(colRef); } } f.getParameter().setColRefs(colRefs); } }
/** * Parameters' name appears in alphabet order. * This method is used for funcs whose parameters appear in arbitrary order */ public String getFullExpressionInAlphabetOrder() { StringBuilder sb = new StringBuilder(expression); sb.append("("); ParameterDesc localParam = parameter; List<String> flatParams = Lists.newArrayList(); while (localParam != null) { flatParams.add(localParam.getValue()); localParam = localParam.getNextParameter(); } Collections.sort(flatParams); sb.append(Joiner.on(",").join(flatParams)); sb.append(")"); return sb.toString(); }
private void initMeasureColumns(Map<String, TableDesc> tables) { if (measures == null || measures.isEmpty()) { return; } TableDesc factTable = tables.get(getFactTable()); for (MeasureDesc m : measures) { m.setName(m.getName().toUpperCase()); if (m.getDependentMeasureRef() != null) { m.setDependentMeasureRef(m.getDependentMeasureRef().toUpperCase()); } FunctionDesc f = m.getFunction(); f.setExpression(f.getExpression().toUpperCase()); f.setReturnDataType(DataType.getInstance(f.getReturnType())); ParameterDesc p = f.getParameter(); p.normalizeColumnValue(); if (p.isColumnType()) { ArrayList<TblColRef> colRefs = Lists.newArrayList(); for (String cName : p.getValue().split("\\s*,\\s*")) { ColumnDesc sourceColumn = factTable.findColumnByName(cName); TblColRef colRef = new TblColRef(sourceColumn); colRefs.add(colRef); allColumns.add(colRef); } if (colRefs.isEmpty() == false) p.setColRefs(colRefs); } } }
/** * Get Full Expression such as sum(amount), count(1), count(*)... */ public String getFullExpression() { StringBuilder sb = new StringBuilder(expression); sb.append("("); if (parameter != null) { sb.append(parameter.getValue()); } sb.append(")"); return sb.toString(); }
String type = func.getParameter().getType(); String value = func.getParameter().getValue(); if (StringUtils.isEmpty(type)) { context.addResult(ResultLevel.ERROR, "Must define type for parameter type " + func.getExpression() + " in " + measure.getName()); if (parameter.getNextParameter() == null) { context.addResult(ResultLevel.ERROR, "Must define at least 2 parameters for function " + func.getExpression() + " in " + measure.getName()); return; ParameterDesc groupByCol = parameter.getNextParameter(); List<String> duplicatedCol = Lists.newArrayList(); while (groupByCol != null) { String embeded_groupby = groupByCol.getValue(); for (DimensionDesc dimensionDesc : cube.getDimensions()) { if (dimensionDesc.getColumn() != null && dimensionDesc.getColumn().equalsIgnoreCase(embeded_groupby)) { groupByCol = groupByCol.getNextParameter();
private void initMeasureColumns(Map<String, TableDesc> tables) { if (measures == null || measures.isEmpty()) { return; } TableDesc factTable = tables.get(getFactTable()); for (MeasureDesc m : measures) { m.setName(m.getName().toUpperCase()); if (m.getDependentMeasureRef() != null) { m.setDependentMeasureRef(m.getDependentMeasureRef().toUpperCase()); } FunctionDesc f = m.getFunction(); f.setExpression(f.getExpression().toUpperCase()); f.initReturnDataType(); ParameterDesc p = f.getParameter(); if (p.isColumnType()) { ArrayList<TblColRef> colRefs = Lists.newArrayList(); for (String cName : p.getValue().split("\\s*,\\s*")) { ColumnDesc sourceColumn = factTable.findColumnByName(cName); TblColRef colRef = new TblColRef(sourceColumn); colRefs.add(colRef); allColumns.add(colRef); } if (colRefs.isEmpty() == false) p.setColRefs(colRefs); } } }
public static ParameterDesc newInstance(Object... objs) { if (objs.length == 0) throw new IllegalArgumentException(); ParameterDesc r = new ParameterDesc(); Object obj = objs[0]; if (obj instanceof TblColRef) { TblColRef col = (TblColRef) obj; r.type = FunctionDesc.PARAMETER_TYPE_COLUMN; r.value = col.getIdentity(); r.colRef = col; } else { r.type = FunctionDesc.PARAMETER_TYPE_CONSTANT; r.value = (String) obj; } if (objs.length >= 2) { r.nextParameter = newInstance(Arrays.copyOfRange(objs, 1, objs.length)); } return r; }
boolean updated = false; for (TblColRef column : columns) { if (column.isSameAs(factTableName, functionDesc.getParameter().getValue())) { if (functionDesc.isCountDistinct()) { functionDesc.setReturnDataType(DataType.getInstance(functionDesc.getReturnType())); functionDesc.getParameter().setColRefs(ImmutableList.of(column)); updated = true; break;
public int getParameterCount() { int count = 0; for (ParameterDesc p = parameter; p != null; p = p.getNextParameter()) { count++; } return count; }
static Set<PlainParameter> createFromParameterDesc(ParameterDesc parameterDesc) { Set<PlainParameter> result = Sets.newHashSet(); ParameterDesc local = parameterDesc; while (local != null) { if (local.isColumnType()) { result.add(createSingleColumnParameter(local)); } else { result.add(createSingleValueParameter(local)); } local = local.nextParameter; } return result; }