Search in sources :

Example 11 with EqualToExpression

use of org.apache.carbondata.core.scan.expression.conditional.EqualToExpression in project carbondata by apache.

the class PrestoFilterUtil method parseFilterExpression.

/**
 * Convert presto-TupleDomain predication into Carbon scan express condition
 *
 * @param originalConstraint presto-TupleDomain
 * @return
 */
static Expression parseFilterExpression(TupleDomain<ColumnHandle> originalConstraint) {
    ImmutableList.Builder<Expression> filters = ImmutableList.builder();
    Domain domain;
    for (ColumnHandle c : originalConstraint.getDomains().get().keySet()) {
        // Build ColumnExpression for Expression(Carbondata)
        CarbondataColumnHandle cdch = (CarbondataColumnHandle) c;
        Type type = cdch.getColumnType();
        DataType coltype = Spi2CarbondataTypeMapper(cdch);
        Expression colExpression = new ColumnExpression(cdch.getColumnName(), coltype);
        domain = originalConstraint.getDomains().get().get(c);
        checkArgument(domain.getType().isOrderable(), "Domain type must be orderable");
        List<Object> singleValues = new ArrayList<>();
        Map<Object, List<Expression>> valueExpressionMap = new HashMap<>();
        for (Range range : domain.getValues().getRanges().getOrderedRanges()) {
            if (range.isSingleValue()) {
                Object value = ConvertDataByType(range.getLow().getValue(), type);
                singleValues.add(value);
            } else {
                if (!range.getLow().isLowerUnbounded()) {
                    Object value = ConvertDataByType(range.getLow().getValue(), type);
                    switch(range.getLow().getBound()) {
                        case ABOVE:
                            if (type == TimestampType.TIMESTAMP) {
                            // todo not now
                            } else {
                                GreaterThanExpression greater = new GreaterThanExpression(colExpression, new LiteralExpression(value, coltype));
                                valueExpressionMap.computeIfAbsent(value, key -> new ArrayList<>()).add(greater);
                            }
                            break;
                        case EXACTLY:
                            GreaterThanEqualToExpression greater = new GreaterThanEqualToExpression(colExpression, new LiteralExpression(value, coltype));
                            valueExpressionMap.computeIfAbsent(value, key -> new ArrayList<>()).add(greater);
                            break;
                        case BELOW:
                            throw new IllegalArgumentException("Low marker should never use BELOW bound");
                        default:
                            throw new AssertionError("Unhandled bound: " + range.getLow().getBound());
                    }
                }
                if (!range.getHigh().isUpperUnbounded()) {
                    Object value = ConvertDataByType(range.getHigh().getValue(), type);
                    switch(range.getHigh().getBound()) {
                        case ABOVE:
                            throw new IllegalArgumentException("High marker should never use ABOVE bound");
                        case EXACTLY:
                            LessThanEqualToExpression less = new LessThanEqualToExpression(colExpression, new LiteralExpression(value, coltype));
                            valueExpressionMap.computeIfAbsent(value, key -> new ArrayList<>()).add(less);
                            break;
                        case BELOW:
                            LessThanExpression less2 = new LessThanExpression(colExpression, new LiteralExpression(value, coltype));
                            valueExpressionMap.computeIfAbsent(value, key -> new ArrayList<>()).add(less2);
                            break;
                        default:
                            throw new AssertionError("Unhandled bound: " + range.getHigh().getBound());
                    }
                }
            }
        }
        if (singleValues.size() == 1) {
            Expression ex;
            if (coltype.equals(DataTypes.STRING)) {
                ex = new EqualToExpression(colExpression, new LiteralExpression(singleValues.get(0), coltype));
            } else if (coltype.equals(DataTypes.TIMESTAMP) || coltype.equals(DataTypes.DATE)) {
                Long value = (Long) singleValues.get(0);
                ex = new EqualToExpression(colExpression, new LiteralExpression(value, coltype));
            } else
                ex = new EqualToExpression(colExpression, new LiteralExpression(singleValues.get(0), coltype));
            filters.add(ex);
        } else if (singleValues.size() > 1) {
            ListExpression candidates = null;
            List<Expression> exs = singleValues.stream().map((a) -> new LiteralExpression(a, coltype)).collect(Collectors.toList());
            candidates = new ListExpression(exs);
            filters.add(new InExpression(colExpression, candidates));
        } else if (valueExpressionMap.size() > 0) {
            List<Expression> valuefilters = new ArrayList<>();
            Expression finalFilters = null;
            List<Expression> expressions;
            for (Map.Entry<Object, List<Expression>> entry : valueExpressionMap.entrySet()) {
                expressions = valueExpressionMap.get(entry.getKey());
                if (expressions.size() == 1) {
                    finalFilters = expressions.get(0);
                } else if (expressions.size() >= 2) {
                    finalFilters = new OrExpression(expressions.get(0), expressions.get(1));
                    for (int i = 2; i < expressions.size(); i++) {
                        finalFilters = new OrExpression(finalFilters, expressions.get(i));
                    }
                }
                valuefilters.add(finalFilters);
            }
            if (valuefilters.size() == 1) {
                finalFilters = valuefilters.get(0);
            } else if (valuefilters.size() >= 2) {
                finalFilters = new AndExpression(valuefilters.get(0), valuefilters.get(1));
                for (int i = 2; i < valuefilters.size(); i++) {
                    finalFilters = new AndExpression(finalFilters, valuefilters.get(i));
                }
            }
            filters.add(finalFilters);
        }
    }
    Expression finalFilters;
    List<Expression> tmp = filters.build();
    if (tmp.size() > 1) {
        finalFilters = new AndExpression(tmp.get(0), tmp.get(1));
        if (tmp.size() > 2) {
            for (int i = 2; i < tmp.size(); i++) {
                finalFilters = new AndExpression(finalFilters, tmp.get(i));
            }
        }
    } else if (tmp.size() == 1)
        finalFilters = tmp.get(0);
    else
        return null;
    return finalFilters;
}
Also used : LessThanEqualToExpression(org.apache.carbondata.core.scan.expression.conditional.LessThanEqualToExpression) Slice(io.airlift.slice.Slice) IntegerType(com.facebook.presto.spi.type.IntegerType) Date(java.util.Date) DateType(com.facebook.presto.spi.type.DateType) DataTypes(org.apache.carbondata.core.metadata.datatype.DataTypes) HashMap(java.util.HashMap) ColumnExpression(org.apache.carbondata.core.scan.expression.ColumnExpression) GreaterThanExpression(org.apache.carbondata.core.scan.expression.conditional.GreaterThanExpression) ArrayList(java.util.ArrayList) BigDecimal(java.math.BigDecimal) Preconditions.checkArgument(com.google.common.base.Preconditions.checkArgument) Calendar(java.util.Calendar) DoubleType(com.facebook.presto.spi.type.DoubleType) DecimalType(com.facebook.presto.spi.type.DecimalType) ImmutableList(com.google.common.collect.ImmutableList) Type(com.facebook.presto.spi.type.Type) Map(java.util.Map) AndExpression(org.apache.carbondata.core.scan.expression.logical.AndExpression) TimestampType(com.facebook.presto.spi.type.TimestampType) GreaterThanEqualToExpression(org.apache.carbondata.core.scan.expression.conditional.GreaterThanEqualToExpression) BigInteger(java.math.BigInteger) SmallintType(com.facebook.presto.spi.type.SmallintType) Expression(org.apache.carbondata.core.scan.expression.Expression) EqualToExpression(org.apache.carbondata.core.scan.expression.conditional.EqualToExpression) BigintType(com.facebook.presto.spi.type.BigintType) Decimals(com.facebook.presto.spi.type.Decimals) DataType(org.apache.carbondata.core.metadata.datatype.DataType) ListExpression(org.apache.carbondata.core.scan.expression.conditional.ListExpression) OrExpression(org.apache.carbondata.core.scan.expression.logical.OrExpression) Range(com.facebook.presto.spi.predicate.Range) Collectors(java.util.stream.Collectors) LiteralExpression(org.apache.carbondata.core.scan.expression.LiteralExpression) TupleDomain(com.facebook.presto.spi.predicate.TupleDomain) List(java.util.List) Domain(com.facebook.presto.spi.predicate.Domain) InExpression(org.apache.carbondata.core.scan.expression.conditional.InExpression) ColumnHandle(com.facebook.presto.spi.ColumnHandle) BooleanType(com.facebook.presto.spi.type.BooleanType) LessThanExpression(org.apache.carbondata.core.scan.expression.conditional.LessThanExpression) VarcharType(com.facebook.presto.spi.type.VarcharType) HashMap(java.util.HashMap) ImmutableList(com.google.common.collect.ImmutableList) InExpression(org.apache.carbondata.core.scan.expression.conditional.InExpression) ArrayList(java.util.ArrayList) GreaterThanExpression(org.apache.carbondata.core.scan.expression.conditional.GreaterThanExpression) OrExpression(org.apache.carbondata.core.scan.expression.logical.OrExpression) GreaterThanEqualToExpression(org.apache.carbondata.core.scan.expression.conditional.GreaterThanEqualToExpression) AndExpression(org.apache.carbondata.core.scan.expression.logical.AndExpression) ColumnExpression(org.apache.carbondata.core.scan.expression.ColumnExpression) DataType(org.apache.carbondata.core.metadata.datatype.DataType) ArrayList(java.util.ArrayList) ImmutableList(com.google.common.collect.ImmutableList) List(java.util.List) ColumnHandle(com.facebook.presto.spi.ColumnHandle) LessThanEqualToExpression(org.apache.carbondata.core.scan.expression.conditional.LessThanEqualToExpression) GreaterThanEqualToExpression(org.apache.carbondata.core.scan.expression.conditional.GreaterThanEqualToExpression) EqualToExpression(org.apache.carbondata.core.scan.expression.conditional.EqualToExpression) LiteralExpression(org.apache.carbondata.core.scan.expression.LiteralExpression) ListExpression(org.apache.carbondata.core.scan.expression.conditional.ListExpression) Range(com.facebook.presto.spi.predicate.Range) LessThanEqualToExpression(org.apache.carbondata.core.scan.expression.conditional.LessThanEqualToExpression) IntegerType(com.facebook.presto.spi.type.IntegerType) DateType(com.facebook.presto.spi.type.DateType) DoubleType(com.facebook.presto.spi.type.DoubleType) DecimalType(com.facebook.presto.spi.type.DecimalType) Type(com.facebook.presto.spi.type.Type) TimestampType(com.facebook.presto.spi.type.TimestampType) SmallintType(com.facebook.presto.spi.type.SmallintType) BigintType(com.facebook.presto.spi.type.BigintType) DataType(org.apache.carbondata.core.metadata.datatype.DataType) BooleanType(com.facebook.presto.spi.type.BooleanType) VarcharType(com.facebook.presto.spi.type.VarcharType) LessThanEqualToExpression(org.apache.carbondata.core.scan.expression.conditional.LessThanEqualToExpression) ColumnExpression(org.apache.carbondata.core.scan.expression.ColumnExpression) GreaterThanExpression(org.apache.carbondata.core.scan.expression.conditional.GreaterThanExpression) AndExpression(org.apache.carbondata.core.scan.expression.logical.AndExpression) GreaterThanEqualToExpression(org.apache.carbondata.core.scan.expression.conditional.GreaterThanEqualToExpression) Expression(org.apache.carbondata.core.scan.expression.Expression) EqualToExpression(org.apache.carbondata.core.scan.expression.conditional.EqualToExpression) ListExpression(org.apache.carbondata.core.scan.expression.conditional.ListExpression) OrExpression(org.apache.carbondata.core.scan.expression.logical.OrExpression) LiteralExpression(org.apache.carbondata.core.scan.expression.LiteralExpression) InExpression(org.apache.carbondata.core.scan.expression.conditional.InExpression) LessThanExpression(org.apache.carbondata.core.scan.expression.conditional.LessThanExpression) TupleDomain(com.facebook.presto.spi.predicate.TupleDomain) Domain(com.facebook.presto.spi.predicate.Domain) HashMap(java.util.HashMap) Map(java.util.Map) LessThanExpression(org.apache.carbondata.core.scan.expression.conditional.LessThanExpression)

Aggregations

EqualToExpression (org.apache.carbondata.core.scan.expression.conditional.EqualToExpression)11 ColumnExpression (org.apache.carbondata.core.scan.expression.ColumnExpression)8 LiteralExpression (org.apache.carbondata.core.scan.expression.LiteralExpression)8 Expression (org.apache.carbondata.core.scan.expression.Expression)7 Test (org.junit.Test)6 ArrayList (java.util.ArrayList)3 List (java.util.List)3 IOException (java.io.IOException)2 GreaterThanEqualToExpression (org.apache.carbondata.core.scan.expression.conditional.GreaterThanEqualToExpression)2 GreaterThanExpression (org.apache.carbondata.core.scan.expression.conditional.GreaterThanExpression)2 InExpression (org.apache.carbondata.core.scan.expression.conditional.InExpression)2 LessThanEqualToExpression (org.apache.carbondata.core.scan.expression.conditional.LessThanEqualToExpression)2 FilterIllegalMemberException (org.apache.carbondata.core.scan.expression.exception.FilterIllegalMemberException)2 FilterUnsupportedException (org.apache.carbondata.core.scan.expression.exception.FilterUnsupportedException)2 ColumnFilterInfo (org.apache.carbondata.core.scan.filter.ColumnFilterInfo)2 CarbonProjection (org.apache.carbondata.hadoop.CarbonProjection)2 ColumnHandle (com.facebook.presto.spi.ColumnHandle)1 Domain (com.facebook.presto.spi.predicate.Domain)1 Range (com.facebook.presto.spi.predicate.Range)1 TupleDomain (com.facebook.presto.spi.predicate.TupleDomain)1