public OrderMetadata getOrderMetadata() { OrderMetaData internalOrdmd = getInternal().getOrderMetaData(); OrderMetadataImpl ordmd = new OrderMetadataImpl(internalOrdmd); ordmd.parent = this; return ordmd; }
protected static Attribute storeStringList(List<String> values, AbstractMemberMetaData mmd) { String name = LDAPUtils.getAttributeNameForField(mmd); BasicAttribute attribute = new BasicAttribute(name); for (int i = 0; i < values.size(); i++) { String value = values.get(i); if (mmd.getOrderMetaData() != null) { value = "{" + i + "}" + value; } attribute.add(value); } return attribute; } }
/** * Stores the each list element as multi-valued attribute. * @param values the values */ protected void storeStringList(List<String> values) { BasicAttribute attribute = new BasicAttribute(name); for (int i = 0; i < values.size(); i++) { String value = values.get(i); if (mmd.getOrderMetaData() != null) { value = "{" + i + "}" + value; } attribute.add(value); } attributes.put(attribute); }
/** * Convenience method for whether a PK is required for the join table. * Extends JoinTable allowing for "ordered List" case which do not require a primary key (so we can have duplicates). * @return Whether a PK is required */ protected boolean requiresPrimaryKey() { if (elementMapping != null && elementMapping instanceof ReferenceMapping && elementMapping.getNumberOfDatastoreMappings() > 1) { // Cannot apply PK when we have multiple interface implementations return false; } if (Set.class.isAssignableFrom(mmd.getType())) { // No dups } else if (mmd.getOrderMetaData() != null && !mmd.getOrderMetaData().isIndexedList()) { // Dups allowed in a List, but if we have an indexed list then we can have a PK return false; } return super.requiresPrimaryKey(); } }
Class instanceType = SCOUtils.getContainerInstanceType(mmd.getType(), mmd.getOrderMetaData() != null); coll = (Collection<Object>) instanceType.newInstance(); fieldValuesForOwner.put(mmd.getAbsoluteFieldNumber(), coll);
public FKListStore(AbstractMemberMetaData ownerMmd, DatastoreManager storeMgr, ClassLoaderResolver clr) { super(ownerMmd, storeMgr, clr); orderMapping = elementTable.getExternalMapping(ownerMemberMetaData, MappingConsumer.MAPPING_TYPE_EXTERNAL_INDEX); if (ownerMemberMetaData.getOrderMetaData() != null && !ownerMemberMetaData.getOrderMetaData().isIndexedList()) { indexedList = false; } if (!storeMgr.storageVersionAtLeast(StorageVersion.READ_OWNED_CHILD_KEYS_FROM_PARENTS) && orderMapping == null && indexedList) { // Early storage version requires that indexedList has an order mapping in the element throw new NucleusUserException(LOCALISER.msg("056041", ownerMemberMetaData.getAbstractClassMetaData().getFullClassName(), ownerMemberMetaData.getName(), elementType)); } }
@Override public boolean isBag(EntityType<?> ownerType, String attributeName) { AttributeImpl<?, ?> attribute = getAttribute(ownerType, attributeName); if (attribute instanceof PluralAttribute) { PluralAttribute<?, ?, ?> pluralAttr = (PluralAttribute<?, ?, ?>) attribute; if (pluralAttr.getCollectionType() == PluralAttribute.CollectionType.COLLECTION) { return true; } else if (pluralAttr.getCollectionType() == PluralAttribute.CollectionType.LIST) { AbstractMemberMetaData metaData = attribute.getMetadata(); return metaData.getOrderMetaData() == null; } } return false; }
@Override public boolean isBag(EntityType<?> ownerType, String attributeName) { AttributeImpl<?, ?> attribute = getAttribute(ownerType, attributeName); if (attribute instanceof PluralAttribute) { PluralAttribute<?, ?, ?> pluralAttr = (PluralAttribute<?, ?, ?>) attribute; if (pluralAttr.getCollectionType() == PluralAttribute.CollectionType.COLLECTION) { return true; } else if (pluralAttr.getCollectionType() == PluralAttribute.CollectionType.LIST) { AbstractMemberMetaData metaData = attribute.getMetadata(); return metaData.getOrderMetaData() == null; } } return false; }
@Override public boolean isBag(EntityType<?> ownerType, String attributeName) { AttributeImpl<?, ?> attribute = getAttribute(ownerType, attributeName); if (attribute instanceof PluralAttribute) { PluralAttribute<?, ?, ?> pluralAttr = (PluralAttribute<?, ?, ?>) attribute; if (pluralAttr.getCollectionType() == PluralAttribute.CollectionType.COLLECTION) { return true; } else if (pluralAttr.getCollectionType() == PluralAttribute.CollectionType.LIST) { AbstractMemberMetaData metaData = attribute.getMetadata(); return metaData.getOrderMetaData() == null; } } return false; }
if (getOwnerMemberMetaData().getOrderMetaData() == null || getOwnerMemberMetaData().getOrderMetaData().isIndexedList())
collectionClass = SCOUtils.getContainerInstanceType(mmd.getType(), mmd.getOrderMetaData() != null);
try Class instanceType = SCOUtils.getContainerInstanceType(mmd.getType(), mmd.getOrderMetaData() != null); coll = (Collection<Object>) instanceType.newInstance();
private JavaTypeMapping addOrderMapping(AbstractMemberMetaData fmd, JavaTypeMapping orderMapping) { boolean needsOrderMapping = false; OrderMetaData omd = fmd.getOrderMetaData(); if (fmd.hasArray()) { // Array field always has the index mapping needsOrderMapping = true; } else if (List.class.isAssignableFrom(fmd.getType())) { // List field needsOrderMapping = !(omd != null && !omd.isIndexedList()); } else if (java.util.Collection.class.isAssignableFrom(fmd.getType()) && omd != null && omd.isIndexedList() && omd.getMappedBy() == null) { // Collection field with <order> and is indexed list so needs order mapping needsOrderMapping = true; } if (needsOrderMapping) { // if the field is list or array type, add index column if (orderMapping == null) { // Create new order mapping since we need one and we aren't using a shared FK orderMapping = addOrderColumn(fmd); } if (!MetaDataUtils.readRelatedKeysFromParent(storeMgr, fmd)) { getExternalOrderMappings().put(fmd, orderMapping); } } return orderMapping; }
collectionClass = SCOUtils.getContainerInstanceType(mmd.getType(), mmd.getOrderMetaData() != null);
collectionClass = SCOUtils.getContainerInstanceType(collectionClass, mmd.getOrderMetaData() != null);
sortPredicates.add(sortPredicate); } else { for (OrderMetaData.FieldOrder fieldOrder : ownerMemberMetaData.getOrderMetaData().getFieldOrders()) { AbstractMemberMetaData orderMmd = elementCmd.getMetaDataForMember(fieldOrder.getFieldName()); String orderPropName = EntityUtils.getPropertyName(storeMgr.getIdentifierFactory(), orderMmd);
private void verifyOneToManyOrderBy(AbstractMemberMetaData ammd, AbstractClassMetaData childAcmd) { OrderMetaData omd = ammd.getOrderMetaData(); OrderMetaData.FieldOrder[] fieldOrders = omd.getFieldOrders(); if (fieldOrders == null) { return; } for (OrderMetaData.FieldOrder fieldOrder : omd.getFieldOrders()) { String propertyName = fieldOrder.getFieldName(); AbstractMemberMetaData orderField = childAcmd.getMetaDataForMember(propertyName); if (orderField.hasExtension(DatastoreManager.PK_ID) || orderField.hasExtension(DatastoreManager.PK_NAME)) { throw new InvalidMetaDataException(GAE_LOCALISER, "AppEngine.MetaData.OrderPartOfPK", ammd.getFullFieldName(), propertyName); } } }
else if (mmd.getOrderMetaData() != null && type.isAssignableFrom(java.util.List.class))
@Override public Object fetch() { RelationType relType = mmd.getRelationType(clr); if (relType == RelationType.ONE_TO_ONE_UNI || relType == RelationType.ONE_TO_ONE_BI) { Set<String> objectClasses = LDAPUtils.getObjectClassesForClass(effectiveClassMetaData); if (objectClasses.isEmpty()) { // embedded into the current entry return fetchEmbedded(); } // embedded as child-entry return fetchFromChild(); } else if (relType == RelationType.ONE_TO_MANY_UNI || relType == RelationType.ONE_TO_MANY_BI) { if (mmd.hasCollection()) { Class instanceType = mmd.getType(); instanceType = org.datanucleus.store.types.SCOUtils.getContainerInstanceType(instanceType, mmd.getOrderMetaData() != null); Collection<Object> coll = fetchFromChildren(instanceType); return SCOUtils.wrapSCOField(op, fieldNumber, coll, true); } } // TODO Localise this throw new NucleusException("Cant obtain value for field " + mmd.getFullFieldName() + " since type=" + mmd.getTypeName() + " is not supported for this datastore"); }
else if (!mmd.getOrderMetaData().isIndexedList())