private static void buildAssosiationSets(MetadataStore metadataStore, List<Builder> edmSchemas) { for (Schema schema : metadataStore.getSchemaList()) { EdmSchema.Builder odataSchema = findSchema(edmSchemas, schema.getName()); EdmEntityContainer.Builder entityContainer = findEntityContainer(edmSchemas, schema.getName()); List<EdmAssociationSet.Builder> assosiationSets = new ArrayList<EdmAssociationSet.Builder>(); List<EdmAssociation.Builder> assosiations = new ArrayList<EdmAssociation.Builder>(); for (Table table : schema.getTables().values()) { // build Associations for (ForeignKey fk : table.getForeignKeys()) { EdmEntitySet.Builder entitySet = findEntitySet(edmSchemas, schema.getName(), table.getName()); EdmEntitySet.Builder refEntitySet = findEntitySet(edmSchemas, schema.getName(), fk.getReferenceTableName()); EdmEntityType.Builder entityType = findEntityType(edmSchemas, schema.getName(), table.getName()); EdmEntityType.Builder refEntityType = findEntityType(edmSchemas, schema.getName(), fk.getReferenceTableName()); // check to see if fk is part of this table's pk, then it is 1 to 1 relation boolean onetoone = sameColumnSet(table.getPrimaryKey(), fk); // Build Association Ends EdmAssociationEnd.Builder endSelf = EdmAssociationEnd.newBuilder() .setRole(table.getName()) .setType(entityType) .setMultiplicity(onetoone ? EdmMultiplicity.ZERO_TO_ONE : EdmMultiplicity.MANY); EdmAssociationEnd.Builder endRef = EdmAssociationEnd.newBuilder() .setRole(fk.getReferenceTableName()) .setType(refEntityType) .setMultiplicity(EdmMultiplicity.ZERO_TO_ONE); // Build Association EdmAssociation.Builder association = EdmAssociation.newBuilder(); association.setName(table.getName() + "_" + fk.getName()); association.setEnds(endSelf, endRef); association.setNamespace( refEntityType .getFullyQualifiedTypeName() .substring(0, refEntityType.getFullyQualifiedTypeName().indexOf('.'))); assosiations.add(association); // Build ReferentialConstraint if (fk.getReferenceColumns() != null) { EdmReferentialConstraint.Builder erc = EdmReferentialConstraint.newBuilder(); erc.setPrincipalRole(fk.getReferenceTableName()); erc.addPrincipalReferences(fk.getReferenceColumns()); erc.setDependentRole(table.getName()); erc.addDependentReferences(getColumnNames(fk.getColumns())); association.setRefConstraint(erc); } // Add EdmNavigationProperty to entity type EdmNavigationProperty.Builder nav = EdmNavigationProperty.newBuilder(fk.getReferenceTableName()); nav.setRelationshipName(fk.getName()); nav.setFromToName(table.getName(), fk.getReferenceTableName()); nav.setRelationship(association); nav.setFromTo(endSelf, endRef); entityType.addNavigationProperties(nav); // Add EdmNavigationProperty to Reference entity type EdmNavigationProperty.Builder refNav = EdmNavigationProperty.newBuilder(table.getName()); refNav.setRelationshipName(fk.getName()); refNav.setFromToName(fk.getReferenceTableName(), table.getName()); refNav.setRelationship(association); refNav.setFromTo(endRef, endSelf); refEntityType.addNavigationProperties(refNav); // build AssosiationSet EdmAssociationSet.Builder assosiationSet = EdmAssociationSet.newBuilder() .setName(table.getName() + "_" + fk.getName()) .setAssociationName(fk.getName()); // Build AssosiationSet Ends EdmAssociationSetEnd.Builder endOne = EdmAssociationSetEnd.newBuilder() .setEntitySet(entitySet) .setRoleName(table.getName()) .setRole( EdmAssociationEnd.newBuilder() .setType(entityType) .setRole(entityType.getName())); EdmAssociationSetEnd.Builder endTwo = EdmAssociationSetEnd.newBuilder() .setEntitySet(refEntitySet) .setRoleName(fk.getReferenceTableName()) .setRole( EdmAssociationEnd.newBuilder() .setType(refEntityType) .setRole(refEntityType.getName())); assosiationSet.setEnds(endOne, endTwo); assosiationSet.setAssociation(association); assosiationSets.add(assosiationSet); } } entityContainer.addAssociationSets(assosiationSets); odataSchema.addAssociations(assosiations); } }
public static EdmEntitySet.Builder getBuilder(String namespace) { EdmEntityType.Builder modelBuilder = MdHierNodeWrapper.getEntityModel(namespace); EdmEntityType.Builder rowType = EdmEntityType.newBuilder().setNamespace(namespace).setName("Row"); EdmEntityType.Builder mdDataDimType = MdDataDimWrapper.getEntityModel(namespace); EdmEntityType.Builder mdHierarchyType = MdHierarchyWrapper.getEntityModel(namespace); EdmAssociationEnd.Builder mdHierNodeRowEnd = EdmAssociationEnd.newBuilder() .setRole("MdHierNode") .setType(modelBuilder) .setMultiplicity(EdmMultiplicity.ONE); EdmAssociationEnd.Builder rowMdHierNodeEnd = EdmAssociationEnd.newBuilder() .setRole("Rows") .setType(rowType) .setMultiplicity(EdmMultiplicity.MANY); EdmAssociation.Builder mdHierNodeRow = EdmAssociation.newBuilder() .setName("MdHierNode-Rows") .setEnds(mdHierNodeRowEnd, rowMdHierNodeEnd); EdmAssociationEnd.Builder mdHierNodeMdDataDimEnd = EdmAssociationEnd.newBuilder() .setRole("MdHierNode") .setType(modelBuilder) .setMultiplicity(EdmMultiplicity.ONE); EdmAssociationEnd.Builder mdDataDimMdHierNodeEnd = EdmAssociationEnd.newBuilder() .setRole("MdDataDim") .setType(mdDataDimType) .setMultiplicity(EdmMultiplicity.MANY); EdmAssociation.Builder mdHierNodeMdDataDim = EdmAssociation.newBuilder() .setName("MdHierNode-MdDataDim") .setEnds(mdHierNodeMdDataDimEnd, mdDataDimMdHierNodeEnd); EdmAssociationEnd.Builder mdHierarchyMdHierNodeEnd = EdmAssociationEnd.newBuilder() .setRole("MdHierarchy") .setType(mdHierarchyType) .setMultiplicity(EdmMultiplicity.ONE); EdmAssociationEnd.Builder mdHierNodeMdHierarchyEnd = EdmAssociationEnd.newBuilder() .setRole("MdHierNode") .setType(modelBuilder) .setMultiplicity(EdmMultiplicity.MANY); EdmAssociation.Builder mdHierNodeMdHierarchy = EdmAssociation.newBuilder() .setName("MdHierNode-MdHierarchy") .setEnds(mdHierNodeMdHierarchyEnd, mdHierarchyMdHierNodeEnd); EdmNavigationProperty.Builder nodeHierarchyNavigationProperty = EdmNavigationProperty.newBuilder("IdHierarchy") .setRelationship(mdHierNodeMdHierarchy) .setFromTo(mdHierNodeMdHierarchy.getEnd1(), mdHierNodeMdHierarchy.getEnd2()); modelBuilder.addNavigationProperties(nodeHierarchyNavigationProperty); EdmNavigationProperty.Builder nodeRowsNavigationProperty = EdmNavigationProperty.newBuilder("NodeRows") .setRelationship(mdHierNodeRow) .setFromTo(mdHierNodeRow.getEnd1(), mdHierNodeRow.getEnd2()); modelBuilder.addNavigationProperties(nodeRowsNavigationProperty); EdmNavigationProperty.Builder nodeDataNavigationProperty = EdmNavigationProperty.newBuilder("NodeData") .setRelationship(mdHierNodeMdDataDim) .setFromTo(mdHierNodeMdDataDim.getEnd1(), mdHierNodeMdDataDim.getEnd2()); modelBuilder.addNavigationProperties(nodeDataNavigationProperty); return EdmEntitySet.newBuilder().setName("MdHierNode").setEntityType(modelBuilder); }