private static ArrayNode sort(JsonNodeFactory factory, Projector projector, ArrayNode node, Path nodePath) { ArrayProjector p = findArrayProjectorForField(projector, nodePath); if (p != null && p.getSort() != null) { LOGGER.debug("Sorting array elements using {}", p.getSort()); return p.sortArray(node, factory); } return node; }
@Override public Projection.Inclusion project(Path p, QueryEvaluationContext ctx) { lastMatch = false; LOGGER.debug("Evaluating array projection for {}, arrayField={}", p, arrayFieldPattern); // Is this field pointing to an element of the array // It is so if 'p' has one more element than 'arrayFieldPattern', and // if it is a matching descendant if (p.numSegments() == arrayFieldPattern.numSegments() + 1 && p.matchingDescendant(arrayFieldPattern)) { Projection.Inclusion ret = projectArray(p, ctx); LOGGER.debug("Projecting array element {}:{}", p, ret); lastMatch = ret == Projection.Inclusion.implicit_inclusion || ret == Projection.Inclusion.explicit_inclusion; return ret; } return Projection.Inclusion.undecided; }
private static ArrayProjector findArrayProjectorForField(Projector p, Path field) { if (p instanceof ListProjector) { List<Projector> items = ((ListProjector) p).getItems(); ListIterator<Projector> itemsItr = items.listIterator(items.size()); while (itemsItr.hasPrevious()) { Projector projector = itemsItr.previous(); ArrayProjector x = findArrayProjectorForField(projector, field); if (x != null) { return x; } } } else if (p instanceof ArrayProjector) { if (field.matches(((ArrayProjector) p).getArrayFieldPattern())) { return (ArrayProjector) p; } return findArrayProjectorForField(p.getNestedProjector(), field); } return null; } }
private SortFieldInfo[] buildSortFields(Sort sort,FieldTreeNode context) { if(sort instanceof SortKey) { return new SortFieldInfo[] {getSortField(((SortKey)sort).getField(),context,((SortKey)sort).isDesc())}; } else { List<SortKey> keys=((CompositeSortKey)sort).getKeys(); SortFieldInfo[] arr=new SortFieldInfo[ keys.size() ]; int i=0; for(SortKey key:keys) { arr[i]=getSortField(key.getField(),context,key.isDesc()); } return arr; } }
/** * Sets up the projector context */ public ArrayProjector(ArrayProjection p, Path ctxPath, FieldTreeNode context) { super(ctxPath, context); sort=p.getSort(); arrayFieldPattern = new Path(ctxPath, p.getField()); include = p.isInclude(); FieldTreeNode nestedCtx = context.resolve(p.getField()); if (nestedCtx instanceof ArrayField) { nestedProjector = Projector.getInstance(p.getProject(), new Path(arrayFieldPattern, Path.ANYPATH), ((ArrayField) nestedCtx).getElement()); if(sort!=null) { sortFields=buildSortFields(sort,((ArrayField)nestedCtx).getElement()); } else { sortFields=null; } } else { throw new EvaluationError(CrudConstants.ERR_EXPECTED_ARRAY_ELEMENT + arrayFieldPattern); } }
@Override public Projection.Inclusion project(Path p, QueryEvaluationContext ctx) { lastMatch = false; LOGGER.debug("Evaluating array projection for {}, arrayField={}", p, arrayFieldPattern); // Is this field pointing to an element of the array // It is so if 'p' has one more element than 'arrayFieldPattern', and // if it is a matching descendant if (p.numSegments() == arrayFieldPattern.numSegments() + 1 && p.matchingDescendant(arrayFieldPattern)) { Projection.Inclusion ret = projectArray(p, ctx); LOGGER.debug("Projecting array element {}:{}", p, ret); lastMatch = ret == Projection.Inclusion.implicit_inclusion || ret == Projection.Inclusion.explicit_inclusion; return ret; } return Projection.Inclusion.undecided; }
private static ArrayProjector findArrayProjectorForField(Projector p, Path field) { if (p instanceof ListProjector) { List<Projector> items = ((ListProjector) p).getItems(); ListIterator<Projector> itemsItr = items.listIterator(items.size()); while (itemsItr.hasPrevious()) { Projector projector = itemsItr.previous(); ArrayProjector x = findArrayProjectorForField(projector, field); if (x != null) { return x; } } } else if (p instanceof ArrayProjector) { if (field.matches(((ArrayProjector) p).getArrayFieldPattern())) { return (ArrayProjector) p; } return findArrayProjectorForField(p.getNestedProjector(), field); } return null; } }
private static ArrayNode sort(JsonNodeFactory factory, Projector projector, ArrayNode node, Path nodePath) { ArrayProjector p = findArrayProjectorForField(projector, nodePath); if (p != null && p.getSort() != null) { LOGGER.debug("Sorting array elements using {}", p.getSort()); return p.sortArray(node, factory); } return node; }
@Override public Boolean project(Path p, QueryEvaluationContext ctx) { decidingProjector=null; lastMatch = false; if (p.matchingPrefix(arrayFieldPattern)) { decidingProjector=this; return include ? Boolean.TRUE : Boolean.FALSE; } // Is this field pointing to an element of the array // It is so if 'p' has one more element than 'arrayFieldPattern', and // if it is a matching descendant if (p.numSegments() == arrayFieldPattern.numSegments() + 1 && p.matchingDescendant(arrayFieldPattern)) { Boolean ret=projectArray(p, ctx); if(ret!=null&&nestedProjector!=null) { decidingProjector=nestedProjector.getDecidingProjector(); } return ret; } return null; }