def truncate_array(name, pred, transform): boundary = pred.lit.value if pred.op == Operation.LT or pred.op == Operation.LT_EQ: return Expressions.predicate(Operation.LT_EQ, name, transform.apply(boundary)) elif pred.op == Operation.GT or pred.op == Operation.GT_EQ: return Expressions.predicate(Operation.GT_EQ, name, transform.apply(boundary)) elif pred.op == Operation.EQ: return Expressions.predicate(pred.op, name, transform.apply(boundary))
def truncate_decimal(name, pred, transform): boundary = pred.lit.value if pred.op == Operation.LT: minus_one = boundary - decimal.Decimal(1) return Expressions.predicate(Operation.LT_EQ, name, transform.apply(minus_one)) elif pred.op == Operation.LT_EQ: return Expressions.predicate(Operation.LT_EQ, name, transform.apply(boundary)) elif pred.op == Operation.GT: plus_one = boundary + decimal.Decimal(1) return Expressions.predicate(Operation.GT_EQ, name, transform.apply(plus_one)) elif pred.op == Operation.GT_EQ: return Expressions.predicate(Operation.GT_EQ, name, transform.apply(boundary)) elif pred.op == Operation.EQ: return Expressions.predicate(pred.op, name, transform.apply(boundary))
def remove_time_filters(self, expressions, expression): if expression.op == Operation.AND: self.remove_time_filters(expressions, expression.left) self.remove_time_filters(expressions, expression.right) return elif isinstance(expression, UnboundPredicate): pred = expression ref = pred.ref lit = pred.lit if ref.name in ScanSummaryBuilder.TIMESTAMP_NAMES: ts_literal = lit.to(TimestampType.without_timezone()) millis = ScanSummaryBuilder.to_millis(ts_literal.value) self.add_timestamp_filter( Expressions.predicate(pred.op, "timestamp_ms", millis)) return expressions.append(expression)