/** * Dependency types come before dependent types * * @param schemas the schema * @return the dependent schema */ public static List<HollowSchema> dependencyOrderedSchemaList(Collection<HollowSchema> schemas) { DependencyIndex idx = new DependencyIndex(); Map<String, HollowSchema> schemaMap = new HashMap<String, HollowSchema>(); for(HollowSchema schema : schemas) { schemaMap.put(schema.getName(), schema); idx.indexSchema(schema, schemas); } List<HollowSchema> orderedSchemas = new ArrayList<HollowSchema>(); while(idx.hasMoreTypes()) orderedSchemas.add(schemaMap.get(idx.getNextType())); return orderedSchemas; }
public String getNextType() { List<String> availableTypes = new ArrayList<String>(); for(Map.Entry<String, Set<String>> entry : dependencyIndex.entrySet()) { if(entry.getValue().isEmpty()) { availableTypes.add(entry.getKey()); } } String firstAvailableType = availableTypes.get(0); for(int i=1;i<availableTypes.size();i++) { if(availableTypes.get(i).compareTo(firstAvailableType) < 0) firstAvailableType = availableTypes.get(i); } removeType(firstAvailableType); return firstAvailableType; }
private void indexSchema(HollowSchema schema, Collection<HollowSchema> allSchemas) { if(schema instanceof HollowCollectionSchema) { String elementType = ((HollowCollectionSchema) schema).getElementType(); addDependency(schema.getName(), elementType, allSchemas); } else if(schema instanceof HollowMapSchema) { String keyType = ((HollowMapSchema)schema).getKeyType(); String valueType = ((HollowMapSchema)schema).getValueType(); addDependency(schema.getName(), keyType, allSchemas); addDependency(schema.getName(), valueType, allSchemas); } else if(schema instanceof HollowObjectSchema) { HollowObjectSchema objectSchema = (HollowObjectSchema) schema; for(int i=0;i<objectSchema.numFields();i++) { if(objectSchema.getFieldType(i) == FieldType.REFERENCE) { String refType = objectSchema.getReferencedType(i); addDependency(schema.getName(), refType, allSchemas); } } } getList(schema.getName(), dependencyIndex); getList(schema.getName(), reverseDependencyIndex); }
private void addDependency(String dependent, String dependency, Collection<HollowSchema> allSchemas) { if(schemaExists(dependency, allSchemas)) { getList(dependent, dependencyIndex).add(dependency); getList(dependency, reverseDependencyIndex).add(dependent); } }