private static boolean containsAll(Set<ColumnDesc> allColumnDescs, Set<TblColRef> allColumns) { for (TblColRef col : allColumns) { if (allColumnDescs.contains(col.getColumnDesc()) == false) return false; } return true; }
private boolean columnDescEquals(TblColRef[] a, TblColRef[] b) { if (a.length != b.length) return false; for (int i = 0; i < a.length; i++) { if (columnDescEquals(a[i].getColumnDesc(), b[i].getColumnDesc()) == false) return false; } return true; }
private Set<ColumnDesc> asColumnDescs(Set<TblColRef> columns) { LinkedHashSet<ColumnDesc> result = new LinkedHashSet<>(); for (TblColRef col : columns) { result.add(col.getColumnDesc()); } return result; }
private static List<TblColRef> notContain(Set<ColumnDesc> allColumnDescs, Set<TblColRef> allColumns) { List<TblColRef> notContainCols = Lists.newArrayList(); for (TblColRef col : allColumns) { if (!allColumnDescs.contains(col.getColumnDesc())) notContainCols.add(col); } return notContainCols; }
private int[] initDerivedColIdx() { int[] idx = new int[deriveInfo.columns.length]; for (int i = 0; i < idx.length; i++) { idx[i] = deriveInfo.columns[i].getColumnDesc().getZeroBasedIndex(); } return idx; }
private void markExposedTablesAndColumns(ProjectCache prjCache, IRealization realization) { if (!realization.isReady()) { return; } for (TblColRef col : realization.getAllColumns()) { TableCache tableCache = prjCache.tables.get(col.getTable()); prjCache.exposedTables.add(tableCache.tableDesc); tableCache.exposed = true; tableCache.exposedColumns.add(col.getColumnDesc()); } }
private ImmutableBitSet collectColumnsInFilter(TupleFilter filter) { Set<TblColRef> columnsInFilter = new HashSet<>(); TupleFilter.collectColumns(filter, columnsInFilter); BitSet result = new BitSet(); for (TblColRef col : columnsInFilter) result.set(col.getColumnDesc().getZeroBasedIndex()); return new ImmutableBitSet(result); }
@Override public Object getValue(TblColRef col) { return next.get(col.getColumnDesc().getZeroBasedIndex()); } };
private void amendAllColumns() { // make sure all PF/FK are included, thus become exposed to calcite later Set<TableRef> tables = collectTablesOnJoinChain(allColumns); for (TableRef t : tables) { JoinDesc join = model.getJoinByPKSide(t); if (join != null) { allColumns.addAll(Arrays.asList(join.getForeignKeyColumns())); allColumns.addAll(Arrays.asList(join.getPrimaryKeyColumns())); } } for (TblColRef col : allColumns) { allColumnDescs.add(col.getColumnDesc()); } }
@Override public Object getValue(TblColRef col) { return aggrValues[col.getColumnDesc().getZeroBasedIndex()].getState(); }
private DictionaryInfo createDictionaryInfo(TblColRef col, IReadableTable inpTable) throws IOException { TableSignature inputSig = inpTable.getSignature(); if (inputSig == null) // table does not exists throw new IllegalStateException("Input table does not exist: " + inpTable); DictionaryInfo dictInfo = new DictionaryInfo(col.getColumnDesc(), col.getDatatype(), inputSig); return dictInfo; }
public void validateColRef(TblColRef ref) { TblColRef expected = colRef(ref.getColumnDesc().getZeroBasedIndex()); if (!expected.equals(ref)) throw new IllegalArgumentException(); }
private ColumnDesc findPk(JoinTableDesc joinTable, ColumnDesc fk) { TblColRef[] fkCols = joinTable.getJoin().getForeignKeyColumns(); for (int i = 0; i < fkCols.length; i++) { if (fkCols[i].getColumnDesc().equals(fk)) return joinTable.getJoin().getPrimaryKeyColumns()[i].getColumnDesc(); } return null; }
public static String getQuotedColExpressionInSourceDB(IJoinedFlatTableDesc flatDesc, TblColRef col) { if (!col.getColumnDesc().isComputedColumn()) { return quoteIdentifier(col.getTableAlias()) + "." + quoteIdentifier(col.getName()); } else { String computeExpr = col.getColumnDesc().getComputedColumnExpr(); return quoteIdentifierInSqlExpr(flatDesc, computeExpr, "`"); } } }
public boolean isPK(ColumnDesc col) { for (JoinTableDesc joinTable : model.getJoinTables()) { JoinDesc join = joinTable.getJoin(); for (TblColRef pk : join.getPrimaryKeyColumns()) { if (pk.getColumnDesc().equals(col)) return true; } } return false; }
@Override public Object getValue(TblColRef col) { int idx = col.getColumnDesc().getZeroBasedIndex(); return rtAggrMetrics.get(idx) ? DecimalUtil.toBigDecimal(next.getValue(idx)) : next.get(idx); } };
private CompareTupleFilter eq(ColumnTupleFilter col, int... values) { CompareTupleFilter r = new CompareTupleFilter(FilterOperatorEnum.IN); r.addChild(col); List<ByteArray> list = Lists.newArrayList(); for (int v : values) { int c = col.getColumn().getColumnDesc().getZeroBasedIndex(); int len = info.getCodeSystem().maxCodeLength(c); ByteArray bytes = new ByteArray(len); BytesUtil.writeLong(v, bytes.array(), bytes.offset(), len); list.add(bytes); } r.addChild(new ConstantTupleFilter(list)); return r; }
private CompareTupleFilter gt(ColumnTupleFilter col, int v) { CompareTupleFilter r = new CompareTupleFilter(FilterOperatorEnum.GT); r.addChild(col); int c = col.getColumn().getColumnDesc().getZeroBasedIndex(); int len = info.getCodeSystem().maxCodeLength(c); ByteArray bytes = new ByteArray(len); BytesUtil.writeLong(v, bytes.array(), bytes.offset(), len); r.addChild(new ConstantTupleFilter(bytes)); return r; }
private CompareTupleFilter gt(ColumnTupleFilter col, int v) { CompareTupleFilter r = new CompareTupleFilter(FilterOperatorEnum.GT); r.addChild(col); int c = col.getColumn().getColumnDesc().getZeroBasedIndex(); int len = info.getCodeSystem().maxCodeLength(c); ByteArray bytes = new ByteArray(len); BytesUtil.writeLong(v, bytes.array(), bytes.offset(), len); r.addChild(new ConstantTupleFilter(bytes)); return r; }
@Test public void verifyAggregateAndHavingFilter() throws IOException { GTInfo info = table.getInfo(); TblColRef havingCol = TblColRef.newInnerColumn("SUM_OF_BIGDECIMAL", InnerDataTypeEnum.LITERAL); havingCol.getColumnDesc().setId("1"); // point to the first aggregated measure CompareTupleFilter havingFilter = compare(havingCol, FilterOperatorEnum.GT, "20"); GTScanRequest req = new GTScanRequestBuilder().setInfo(info).setRanges(null).setDimensions(null) .setAggrGroupBy(setOf(1)).setAggrMetrics(setOf(4)).setAggrMetricsFuncs(new String[] { "sum" }) .setHavingFilterPushDown(havingFilter).createGTScanRequest(); doScanAndVerify(table, useDeserializedGTScanRequest(req), "[null, 20, null, null, 42.0]", "[null, 30, null, null, 52.5]"); }