@Override public List<Integer> mapPropertyNamePathToFieldIdPath(String[] path) { if (path.length > 1) { throw new IllegalStateException("Nested attributes are not supported"); } String columnName = path[0]; for (RowPropertyHelper.ColumnMetadata c : rowMetadata.getColumns()) { if (c.getColumnName().equals(columnName)) { return Collections.singletonList(c.getColumnIndex()); } } throw new IllegalArgumentException("Column not found : " + columnName); }
@Override public boolean isComparableProperty(RowPropertyHelper.ColumnMetadata attributeMetadata) { Class<?> propertyType = attributeMetadata.getPropertyType(); return propertyType.isPrimitive() || Comparable.class.isAssignableFrom(propertyType); } }
columns.put(p, new RowPropertyHelper.ColumnMetadata(idx, "C" + idx, propertyType)); if (c == null || c.getColumnIndex() >= noOfGroupingColumns) { throw log.expressionMustBePartOfAggregateFunctionOrShouldBeIncludedInGroupByClause(p.toString()); Class<?> propertyType = FieldAccumulator.getOutputType(((AggregationPropertyPath) p).getAggregationFunction(), parsingResult.getProjectedTypes()[i]); int idx = columns.size(); columns.put(p, new RowPropertyHelper.ColumnMetadata(idx, "C" + idx, propertyType)); if (c == null || c.getColumnIndex() >= noOfGroupingColumns) { throw log.expressionMustBePartOfAggregateFunctionOrShouldBeIncludedInGroupByClause(p.toString()); Class<?> propertyType = propertyHelper.getPrimitivePropertyType(parsingResult.getTargetEntityMetadata(), p.asArrayPath()); int idx = columns.size(); columns.put(p, new RowPropertyHelper.ColumnMetadata(idx, "C" + idx, propertyType)); for (PropertyPath<?> p : columns.keySet()) { RowPropertyHelper.ColumnMetadata c = columns.get(p); _columns[c.getColumnIndex()] = c; String asStringPath = p.asStringPath(); Integer inIdx = inColumns.get(asStringPath); FieldAccumulator acc = FieldAccumulator.makeAccumulator(((AggregationPropertyPath) p).getAggregationFunction(), inIdx, c.getColumnIndex(), c.getPropertyType()); accumulators.add(acc); secondPhaseQuery.append(c.getColumnName()); secondPhaseQuery.append(c.getColumnName()).append(' ').append(sortField.isAscending() ? "ASC" : "DESC");
columns.put(p, new RowPropertyHelper.ColumnMetadata(idx, "C" + idx, propertyType)); if (c == null || c.getColumnIndex() >= noOfGroupingColumns) { throw log.expressionMustBePartOfAggregateFunctionOrShouldBeIncludedInGroupByClause(p.toString()); Class<?> propertyType = FieldAccumulator.getOutputType(((AggregationPropertyPath) p).getAggregationFunction(), parsingResult.getProjectedTypes()[i]); int idx = columns.size(); columns.put(p, new RowPropertyHelper.ColumnMetadata(idx, "C" + idx, propertyType)); if (c == null || c.getColumnIndex() >= noOfGroupingColumns) { throw log.expressionMustBePartOfAggregateFunctionOrShouldBeIncludedInGroupByClause(p.toString()); Class<?> propertyType = propertyHelper.getPrimitivePropertyType(parsingResult.getTargetEntityMetadata(), p.asArrayPath()); int idx = columns.size(); columns.put(p, new RowPropertyHelper.ColumnMetadata(idx, "C" + idx, propertyType)); for (PropertyPath<?> p : columns.keySet()) { RowPropertyHelper.ColumnMetadata c = columns.get(p); _columns[c.getColumnIndex()] = c; String asStringPath = p.asStringPath(); Integer inIdx = inColumns.get(asStringPath); FieldAccumulator acc = FieldAccumulator.makeAccumulator(((AggregationPropertyPath) p).getAggregationFunction(), inIdx, c.getColumnIndex(), c.getPropertyType()); accumulators.add(acc); secondPhaseQuery.append(c.getColumnName()); secondPhaseQuery.append(c.getColumnName()).append(' ').append(sortField.isAscending() ? "ASC" : "DESC");
for (PropertyPath<?> p : columns.keySet()) { RowPropertyHelper.ColumnMetadata c = columns.get(p); if (c.getColumnIndex() > 0) { secondPhaseQuery.append(", "); FieldAccumulator acc = FieldAccumulator.makeAccumulator(((AggregationPropertyPath) p).getAggregationFunction(), c.getColumnIndex(), c.getColumnIndex(), c.getPropertyType()); if (propertyHelper.isRepeatedProperty(parsingResult.getTargetEntityMetadata(), p.asArrayPath())) { secondPhaseAccumulators.add(acc); if (((AggregationPropertyPath) p).getAggregationFunction() == AggregationFunction.COUNT) { c = new RowPropertyHelper.ColumnMetadata(c.getColumnIndex(), c.getColumnName(), Long.class); acc = FieldAccumulator.makeAccumulator(AggregationFunction.SUM, c.getColumnIndex(), c.getColumnIndex(), Long.class); _columns[c.getColumnIndex()] = c; thirdPhaseQuery.append(", "); thirdPhaseQuery.append(c.getColumnName()); thirdPhaseQuery.append(c.getColumnName()).append(' ').append(sortField.isAscending() ? "ASC" : "DESC");
for (PropertyPath<?> p : columns.keySet()) { RowPropertyHelper.ColumnMetadata c = columns.get(p); if (c.getColumnIndex() > 0) { secondPhaseQuery.append(", "); FieldAccumulator acc = FieldAccumulator.makeAccumulator(((AggregationPropertyPath) p).getAggregationFunction(), c.getColumnIndex(), c.getColumnIndex(), c.getPropertyType()); if (propertyHelper.isRepeatedProperty(parsingResult.getTargetEntityMetadata(), p.asArrayPath())) { secondPhaseAccumulators.add(acc); if (((AggregationPropertyPath) p).getAggregationFunction() == AggregationFunction.COUNT) { c = new RowPropertyHelper.ColumnMetadata(c.getColumnIndex(), c.getColumnName(), Long.class); acc = FieldAccumulator.makeAccumulator(AggregationFunction.SUM, c.getColumnIndex(), c.getColumnIndex(), Long.class); _columns[c.getColumnIndex()] = c; thirdPhaseQuery.append(", "); thirdPhaseQuery.append(c.getColumnName()); thirdPhaseQuery.append(c.getColumnName()).append(' ').append(sortField.isAscending() ? "ASC" : "DESC");
@Override public List<?> mapPropertyNamePathToFieldIdPath(RowMetadata type, String[] propertyPath) { if (propertyPath.length > 1) { throw new IllegalStateException("Nested attributes are not supported"); } String columnName = propertyPath[0]; for (RowPropertyHelper.ColumnMetadata c : rowMetadata.getColumns()) { if (c.getColumnName().equals(columnName)) { return Collections.singletonList(c.getColumnIndex()); } } throw new IllegalArgumentException("Column not found : " + columnName); }
@Override public boolean hasProperty(RowPropertyHelper.RowMetadata entityType, String[] propertyPath) { if (propertyPath.length > 1) { throw new IllegalStateException("Nested attributes are not supported"); } String columnName = propertyPath[0]; for (RowPropertyHelper.ColumnMetadata c : rowMetadata.getColumns()) { if (c.getColumnName().equals(columnName)) { return true; } } return false; }
@Override protected void processAttributes(AttributeNode<RowPropertyHelper.ColumnMetadata, Integer> node, Object instance) { for (AttributeNode<RowPropertyHelper.ColumnMetadata, Integer> childAttribute : node.getChildren()) { Object attributeValue = null; if (instance != null) { attributeValue = childAttribute.getMetadata().getValue(instance); } childAttribute.processValue(attributeValue, this); } } }
private ColumnMetadata getColumnAccessor(String[] propertyPath) { if (propertyPath.length > 1) { throw new IllegalStateException("Nested attributes are not supported"); } String columnName = propertyPath[0]; for (RowPropertyHelper.ColumnMetadata c : rowMetadata.getColumns()) { if (c.getColumnName().equals(columnName)) { return c; } } throw new IllegalArgumentException("Column not found : " + columnName); }
@Override public Class<?> getPrimitivePropertyType(RowPropertyHelper.RowMetadata entityType, String[] propertyPath) { // entityType is ignored in this case! Class<?> propType = getColumnAccessor(propertyPath).getPropertyType(); if (propType.isEnum() || primitives.containsKey(propType)) { return propType; } return null; }