@Override public boolean isEvaluable() { switch (operator) { case NOT: // Un-evaluatable branch will be pruned and be replaced with TRUE. // And this must happen at the top NOT, otherwise NOT (TRUE) becomes false. for (TupleFilter child : children) { if (TupleFilter.isEvaluableRecursively(child) == false) return false; } return true; case OR: // (anything OR un-evaluable) will become (anything or TRUE) which is effectively TRUE. // The "anything" is not evaluated, kinda disabled, by the un-evaluable part. // If it's partially un-evaluable, then "anything" is partially disabled, and the OR is still not fully evaluatable. for (TupleFilter child : children) { if (TupleFilter.isEvaluableRecursively(child) == false) return false; } return true; default: return true; } }
public static boolean isEvaluableRecursively(TupleFilter filter) { if (filter == null) return true; if (!filter.isEvaluable()) return false; for (TupleFilter child : filter.getChildren()) { if (!isEvaluableRecursively(child)) return false; } return true; }
if (!TupleFilter.isEvaluableRecursively(filter)) { storageLimitLevel = StorageLimitLevel.NO_LIMIT; logger.debug("storageLimitLevel set to NO_LIMIT because the filter isn't evaluable");
public GTFilterScanner(IGTScanner delegated, GTScanRequest req, IGTBypassChecker checker) { super(delegated); this.checker = checker; if (req != null) { this.filter = req.getFilterPushDown(); this.filterCodeSystem = GTUtil.wrap(getInfo().codeSystem.getComparator()); this.oneTuple = new IEvaluatableTuple() { @Override public Object getValue(TblColRef col) { return next.get(col.getColumnDesc().getZeroBasedIndex()); } }; if (!TupleFilter.isEvaluableRecursively(filter)) throw new IllegalArgumentException(); } }
private void validateFilterPushDown(GTInfo info) { if (!hasFilterPushDown()) return; Set<TblColRef> filterColumns = Sets.newHashSet(); TupleFilter.collectColumns(filterPushDown, filterColumns); for (TblColRef col : filterColumns) { // filter columns must belong to the table info.validateColRef(col); // filter columns must be returned to satisfy upper layer evaluation (calcite) columns = columns.set(col.getColumnDesc().getZeroBasedIndex()); } // un-evaluatable filter must be removed if (!TupleFilter.isEvaluableRecursively(filterPushDown)) { Set<TblColRef> unevaluableColumns = Sets.newHashSet(); filterPushDown = GTUtil.convertFilterUnevaluatable(filterPushDown, info, unevaluableColumns); // columns in un-evaluatable filter must be returned without loss so upper layer can do final evaluation if (hasAggregation()) { for (TblColRef col : unevaluableColumns) { aggrGroupBy = aggrGroupBy.set(col.getColumnDesc().getZeroBasedIndex()); } } } }
if (!TupleFilter.isEvaluableRecursively(filter)) { TupleFilter.collectColumns(filter, inevaluableColumns); return ConstantTupleFilter.TRUE;
@Override public TupleFilter onSerialize(TupleFilter filter) { if (filter == null) return null; // In case of NOT(unEvaluatableFilter), we should immediately replace it as TRUE, // Otherwise, unEvaluatableFilter will later be replace with TRUE and NOT(unEvaluatableFilter) // will always return FALSE. if (filter.getOperator() == FilterOperatorEnum.NOT && !TupleFilter.isEvaluableRecursively(filter)) { TupleFilter.collectColumns(filter, unevaluatableColumnCollector); return ConstantTupleFilter.TRUE; } // shortcut for unEvaluatable filter if (!filter.isEvaluable()) { TupleFilter.collectColumns(filter, unevaluatableColumnCollector); return ConstantTupleFilter.TRUE; } // map to column onto grid table if (colMapping != null && filter instanceof ColumnTupleFilter) { ColumnTupleFilter colFilter = (ColumnTupleFilter) filter; int gtColIdx = mapCol(colFilter.getColumn()); return new ColumnTupleFilter(info.colRef(gtColIdx)); } // encode constants if (useEncodeConstants && filter instanceof CompareTupleFilter) { return encodeConstants((CompareTupleFilter) filter); } return filter; }
public static boolean isEvaluableRecursively(TupleFilter filter) { if (filter == null) return true; if (!filter.isEvaluable()) return false; for (TupleFilter child : filter.getChildren()) { if (!isEvaluableRecursively(child)) return false; } return true; }
private void setLimit(TupleFilter filter, StorageContext context) { boolean goodAggr = context.isExactAggregation(); boolean goodFilter = filter == null || (TupleFilter.isEvaluableRecursively(filter) && context.isCoprocessorEnabled()); boolean goodSort = context.hasSort() == false; if (goodAggr && goodFilter && goodSort) { logger.info("Enable limit " + context.getLimit()); context.enableLimit(); } }
if (filter.getOperator() == FilterOperatorEnum.NOT && !TupleFilter.isEvaluableRecursively(filter)) { TupleFilter.collectColumns(filter, unstrictlyFilteredColumns); return ConstantTupleFilter.TRUE; return filter; if (!TupleFilter.isEvaluableRecursively(filter)) { TupleFilter.collectColumns(filter, unstrictlyFilteredColumns); return ConstantTupleFilter.TRUE;
@Override public boolean isEvaluable() { switch (operator) { case NOT: // Un-evaluatable branch will be pruned and be replaced with TRUE. // And this must happen at the top NOT, otherwise NOT (TRUE) becomes false. for (TupleFilter child : children) { if (TupleFilter.isEvaluableRecursively(child) == false) return false; } return true; case OR: // (anything OR un-evaluable) will become (anything or TRUE) which is effectively TRUE. // The "anything" is not evaluated, kinda disabled, by the un-evaluable part. // If it's partially un-evaluable, then "anything" is partially disabled, and the OR is still not fully evaluatable. for (TupleFilter child : children) { if (TupleFilter.isEvaluableRecursively(child) == false) return false; } return true; default: return true; } }
@Override public boolean isEvaluable() { switch (operator) { case NOT: // Un-evaluatable branch will be pruned and be replaced with TRUE. // And this must happen at the top NOT, otherwise NOT (TRUE) becomes false. for (TupleFilter child : children) { if (TupleFilter.isEvaluableRecursively(child) == false) return false; } return true; case OR: // (anything OR un-evaluable) will become (anything or TRUE) which is effectively TRUE. // The "anything" is not evaluated, kinda disabled, by the un-evaluable part. // If it's partially un-evaluable, then "anything" is partially disabled, and the OR is still not fully evaluatable. for (TupleFilter child : children) { if (TupleFilter.isEvaluableRecursively(child) == false) return false; } return true; default: return true; } }
public static boolean isEvaluableRecursively(TupleFilter filter) { if (filter == null) return true; if (!filter.isEvaluable()) return false; for (TupleFilter child : filter.getChildren()) { if (!isEvaluableRecursively(child)) return false; } return true; }
public static boolean isEvaluableRecursively(TupleFilter filter) { if (filter == null) return true; if (!filter.isEvaluable()) return false; for (TupleFilter child : filter.getChildren()) { if (!isEvaluableRecursively(child)) return false; } return true; }
if (!TupleFilter.isEvaluableRecursively(filter)) { storageLimitLevel = StorageLimitLevel.NO_LIMIT; logger.debug("storageLimitLevel set to NO_LIMIT because the filter isn't evaluable");
public GTFilterScanner(IGTScanner delegated, GTScanRequest req, IGTBypassChecker checker) { super(delegated); this.checker = checker; if (req != null) { this.filter = req.getFilterPushDown(); this.filterCodeSystem = GTUtil.wrap(getInfo().codeSystem.getComparator()); this.oneTuple = new IEvaluatableTuple() { @Override public Object getValue(TblColRef col) { return next.get(col.getColumnDesc().getZeroBasedIndex()); } }; if (!TupleFilter.isEvaluableRecursively(filter)) throw new IllegalArgumentException(); } }
private void validateFilterPushDown(GTInfo info) { if (!hasFilterPushDown()) return; Set<TblColRef> filterColumns = Sets.newHashSet(); TupleFilter.collectColumns(filterPushDown, filterColumns); for (TblColRef col : filterColumns) { // filter columns must belong to the table info.validateColRef(col); // filter columns must be returned to satisfy upper layer evaluation (calcite) columns = columns.set(col.getColumnDesc().getZeroBasedIndex()); } // un-evaluatable filter must be removed if (!TupleFilter.isEvaluableRecursively(filterPushDown)) { Set<TblColRef> unevaluableColumns = Sets.newHashSet(); filterPushDown = GTUtil.convertFilterUnevaluatable(filterPushDown, info, unevaluableColumns); // columns in un-evaluatable filter must be returned without loss so upper layer can do final evaluation if (hasAggregation()) { for (TblColRef col : unevaluableColumns) { aggrGroupBy = aggrGroupBy.set(col.getColumnDesc().getZeroBasedIndex()); } } } }
if (!TupleFilter.isEvaluableRecursively(filter)) { TupleFilter.collectColumns(filter, inevaluableColumns); return ConstantTupleFilter.TRUE;
@Override public TupleFilter onSerialize(TupleFilter filter) { if (filter == null) return null; // In case of NOT(unEvaluatableFilter), we should immediately replace it as TRUE, // Otherwise, unEvaluatableFilter will later be replace with TRUE and NOT(unEvaluatableFilter) // will always return FALSE. if (filter.getOperator() == FilterOperatorEnum.NOT && !TupleFilter.isEvaluableRecursively(filter)) { TupleFilter.collectColumns(filter, unevaluatableColumnCollector); return ConstantTupleFilter.TRUE; } // shortcut for unEvaluatable filter if (!filter.isEvaluable()) { TupleFilter.collectColumns(filter, unevaluatableColumnCollector); return ConstantTupleFilter.TRUE; } // map to column onto grid table if (colMapping != null && filter instanceof ColumnTupleFilter) { ColumnTupleFilter colFilter = (ColumnTupleFilter) filter; int gtColIdx = mapCol(colFilter.getColumn()); return new ColumnTupleFilter(info.colRef(gtColIdx)); } // encode constants if (useEncodeConstants && filter instanceof CompareTupleFilter) { return encodeConstants((CompareTupleFilter) filter); } return filter; }