public Predicate convert(List<ScalarOperator> operators, DeltaLakeContext context) {
        DeltaLakeExprVisitor visitor = new DeltaLakeExprVisitor();
        List<Predicate> predicates = Lists.newArrayList();

        for (ScalarOperator operator : operators) {
            Predicate predicate = operator.accept(visitor, context);
            if (predicate != null) {
                predicates.add(predicate);
            }
        }

        Optional<Predicate> result = predicates.stream().reduce(And::new);
        return result.orElse(ALWAYS_TRUE);
    }
@Test
    public void testConvertTimestampToNtz() {
        ScalarOperationToDeltaLakeExpr converter = new ScalarOperationToDeltaLakeExpr();
        ScalarOperationToDeltaLakeExpr.DeltaLakeContext context =
                new ScalarOperationToDeltaLakeExpr.DeltaLakeContext(schema, partitionColumns);

        LocalDateTime localDateTime = LocalDateTime.now();
        ConstantOperator value = ConstantOperator.createDatetime(localDateTime);
        ScalarOperator operator = new BinaryPredicateOperator(BinaryType.LT, cTimestampCol, value);
        List<ScalarOperator> operators = new ArrayList<>(List.of(operator));
        Predicate convertExpr = converter.convert(operators, context);
        long timestamp = localDateTime.atZone(ZoneOffset.UTC).toEpochSecond() * 1000 * 1000
                + localDateTime.getNano() / 1000;
        Predicate expectedExpr = new Predicate("<", cDeltaTimestampCol, Literal.ofTimestamp(timestamp));
        Assert.assertEquals(convertExpr.toString(), expectedExpr.toString());
    }