private Slot<ColumnView> addSubFormJoinedColumn(FilterLevel filterLevel, NodeMatch match) { JoinNode node = match.getJoins().get(0); Slot<PrimaryKeyMap> primaryKey = addPrimaryKey(filterLevel, node.getLeftFormId()); Slot<ColumnView> parentColumn = addParentColumn(filterLevel, node.getRightFormId()); Slot<ColumnView> dataColumn = getDataColumn(filterLevel, match.getFormClass().getId(), match.getFieldComponent()); SubFormJoin join = new SubFormJoin(primaryKey, parentColumn); return new JoinedSubFormColumnViewSlot(Collections.singletonList(join), dataColumn, node.getAggregation().or(SumFunction.INSTANCE)); }
private Slot<ForeignKey> addForeignKey(FilterLevel filterLevel, JoinNode node) { Slot<ForeignKey> foreignKey = getTable(node.getLeftFormId()).addForeignKey(node.getReferenceField(), node.getRightFormId()); Slot<TableFilter> filter = getFilter(filterLevel, node.getLeftFormId()); return new MemoizedSlot2<>(foreignKey, filter, new BiFunction<ForeignKey, TableFilter, ForeignKey>() { @Override public ForeignKey apply(ForeignKey foreignKey, TableFilter filter) { return filter.apply(foreignKey); } }); }
private ReferenceJoin addJoinLink(FilterLevel filterLevel, JoinNode node) { Slot<ForeignKey> foreignKey = addForeignKey(filterLevel, node); Slot<PrimaryKeyMap> primaryKey = addPrimaryKey(filterLevel, node.getRightFormId()); ReferenceJoinKey referenceJoinKey = new ReferenceJoinKey(filterLevel, foreignKey, primaryKey); ReferenceJoin joinLink = joinLinks.get(referenceJoinKey); if(joinLink == null) { joinLink = new ReferenceJoin(foreignKey, primaryKey, node.toString()); joinLinks.put(referenceJoinKey, joinLink); } return joinLink; }
public static NodeMatch forId(FormTree.Node parent, FormClass formClass) { List<List<FormTree.Node>> partitions = partitionOnJoins(parent); List<FormTree.Node> leaf = partitions.get(partitions.size() - 1); // Embedded records are not independent resources, and so // do not have their own ID. So the leaf field MUST be a reference field Preconditions.checkArgument(leaf.get(0).isReference()); NodeMatch match = new NodeMatch(); match.joins = joinsTo(partitions, Optional.<StatFunction>absent()); match.joins.add(new JoinNode(JoinType.REFERENCE, leaf.get(0).getDefiningFormClass().getId(), toExpr(leaf), formClass.getId())); match.formClass = formClass; match.type = Type.RECORD_ID; return match; }
public String toDebugString() { StringBuilder s = new StringBuilder(); for (JoinNode join : joins) { s.append(join.getReferenceField()); s.append('>'); } switch (type) { case FORM_NAME: s.append(formClass.getLabel()); break; case RECORD_ID: s.append(formClass.getId()); s.append("@id"); break; case FORM_ID: s.append(formClass.getId()); s.append("@formId"); break; case FIELD: s.append(fieldComponent); break; } return s.toString(); }
if(match.getJoins().size() == 1 && match.getJoins().get(0).getType() == JoinType.SUBFORM) { return addSubFormJoinedColumn(filterLevel, match);