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 testConvertIsNullPredicate() {
        ScalarOperationToDeltaLakeExpr converter = new ScalarOperationToDeltaLakeExpr();
        ScalarOperationToDeltaLakeExpr.DeltaLakeContext context =
                new ScalarOperationToDeltaLakeExpr.DeltaLakeContext(schema, new HashSet<>());
        List<ScalarOperator> operators;

        // is null
        IsNullPredicateOperator isNullPredicateOperator = new IsNullPredicateOperator(false, cIntCol);
        operators = new ArrayList<>(List.of(isNullPredicateOperator));
        Predicate convertExpr = converter.convert(operators, context);
        Predicate expectedExpr = new Predicate("IS_NULL", cDeltaIntCol);
        Assert.assertEquals(convertExpr.toString(), expectedExpr.toString());

        // is not null
        isNullPredicateOperator = new IsNullPredicateOperator(true, cIntCol);
        operators = new ArrayList<>(List.of(isNullPredicateOperator));
        convertExpr = converter.convert(operators, context);
        expectedExpr = new Predicate("IS_NOT_NULL", cDeltaIntCol);
        Assert.assertEquals(convertExpr.toString(), expectedExpr.toString());
    }