package org.infinispan.objectfilter.impl.syntax.parser; import java.util.Arrays; import java.util.Set; import org.infinispan.objectfilter.SortField; import org.infinispan.objectfilter.impl.ql.PropertyPath; import org.infinispan.objectfilter.impl.syntax.BooleanExpr; /** * @param <TypeMetadata> is either {@link java.lang.Class} or {@link org.infinispan.protostream.descriptors.Descriptor} * @author anistor@redhat.com * @since 7.0 */ public final class IckleParsingResult<TypeMetadata> { static final class SortFieldImpl<TypeMetadata> implements SortField { public final PropertyPath<TypeDescriptor<TypeMetadata>> path; public final boolean isAscending; SortFieldImpl(PropertyPath<TypeDescriptor<TypeMetadata>> path, boolean isAscending) { this.path = path; this.isAscending = isAscending; } public PropertyPath<TypeDescriptor<TypeMetadata>> getPath() { return path; } public boolean isAscending() { return isAscending; } @Override public String toString() { return "SortField(" + path + ", " + (isAscending ? "ASC" : "DESC") + ')'; } } private final String queryString; private final Set<String> parameterNames; private final BooleanExpr whereClause; private final BooleanExpr havingClause; private final String targetEntityName; private final TypeMetadata targetEntityMetadata; private final PropertyPath[] projectedPaths; private final Class<?>[] projectedTypes; private final PropertyPath[] groupBy; private final SortField[] sortFields; //todo [anistor] make package local public IckleParsingResult(String queryString, Set<String> parameterNames, BooleanExpr whereClause, BooleanExpr havingClause, String targetEntityName, TypeMetadata targetEntityMetadata, PropertyPath[] projectedPaths, Class<?>[] projectedTypes, PropertyPath[] groupBy, SortField[] sortFields) { this.queryString = queryString; this.parameterNames = parameterNames; this.whereClause = whereClause; this.havingClause = havingClause; this.targetEntityName = targetEntityName; this.targetEntityMetadata = targetEntityMetadata; if (projectedPaths != null && (projectedTypes == null || projectedTypes.length != projectedPaths.length) || projectedPaths == null && projectedTypes != null) { throw new IllegalArgumentException("projectedPaths and projectedTypes sizes must match"); } this.projectedPaths = projectedPaths; this.projectedTypes = projectedTypes; this.groupBy = groupBy; this.sortFields = sortFields; } public String getQueryString() { return queryString; } public Set<String> getParameterNames() { return parameterNames; } /** * Returns the filter created while walking the parse tree. * * @return the filter created while walking the parse tree */ public BooleanExpr getWhereClause() { return whereClause; } public BooleanExpr getHavingClause() { return havingClause; } /** * Returns the original entity name as given in the query * * @return the entity name of the query */ public String getTargetEntityName() { return targetEntityName; } /** * Returns the entity type of the parsed query. * * @return the entity type of the parsed query */ public TypeMetadata getTargetEntityMetadata() { return targetEntityMetadata; } /** * Returns the projections of the parsed query, represented as dot paths in case of references to fields of embedded * entities, e.g. {@code ["foo", "bar.qaz"]}. * * @return an array with the projections of the parsed query or null if the query has no projections */ public String[] getProjections() { if (projectedPaths == null) { return null; } String[] projections = new String[projectedPaths.length]; for (int i = 0; i < projectedPaths.length; i++) { projections[i] = projectedPaths[i].asStringPath(); } return projections; } public PropertyPath[] getProjectedPaths() { return projectedPaths; } public Class<?>[] getProjectedTypes() { return projectedTypes; } public boolean hasGroupingOrAggregations() { if (groupBy != null || havingClause != null) { return true; } if (projectedPaths != null) { for (PropertyPath<?> p : projectedPaths) { if (p instanceof AggregationPropertyPath) { return true; } } } if (sortFields != null) { for (SortField s : sortFields) { if (s.getPath() instanceof AggregationPropertyPath) { return true; } } } return false; } public PropertyPath[] getGroupBy() { return groupBy; } public SortField[] getSortFields() { return sortFields; } @Override public String toString() { return "FilterParsingResult [" + " queryString=" + queryString + ", targetEntityName=" + targetEntityName + ", parameterNames=" + parameterNames + ", whereClause=" + whereClause + ", havingClause=" + havingClause + ", projectedPaths=" + Arrays.toString(projectedPaths) + ", projectedTypes=" + Arrays.toString(projectedTypes) + ", groupBy=" + Arrays.toString(groupBy) + ", sortFields=" + Arrays.toString(sortFields) + "]"; } }