/** * Method to check if an element is already persistent or is persistent but managed by * a different persistence manager. * @param ec ExecutionContext * @param element The element * @return Whether it is valid for reading. */ protected boolean validateElementForReading(ExecutionContext ec, Object element) { if (!validateElementType(clr, element)) { return false; } if (element != null) { if ((!ec.getApiAdapter().isPersistent(element) || ec != ec.getApiAdapter().getExecutionContext(element)) && !ec.getApiAdapter().isDetached(element)) { return false; } } return true; }
public boolean remove(ObjectProvider op, Object element, int currentSize, boolean allowCascadeDelete) { ExecutionContext ec = op.getExecutionContext(); if (!validateElementForReading(ec, element)) { return false; } Object elementToRemove = element; if (ec.getApiAdapter().isDetached(element)) { // Element passed in is detached so find attached version (DON'T attach this object) elementToRemove = ec.findObject(ec.getApiAdapter().getIdForObject(element), true, false, element.getClass().getName()); } return internalRemove(op, elementToRemove, currentSize); }
public void clear(ObjectProvider op) { boolean deleteElements = deleteElementsOnRemoveOrClear(); ExecutionContext ec = op.getExecutionContext(); Iterator elementsIter = iterator(op); if (elementsIter != null) { while (elementsIter.hasNext()) { Object element = elementsIter.next(); if (ec.getApiAdapter().isPersistable(element) && ec.getApiAdapter().isDeleted(element)) { // Element is waiting to be deleted so flush it (it has the FK) ObjectProvider objSM = ec.findObjectProvider(element); objSM.flush(); } else { if (deleteElements) { ec.deleteObjectInternal(element); } } } } }
public void clear(ObjectProvider op) { // Find elements present in the datastore and process them one-by-one boolean deleteElements = deleteElementsOnRemoveOrClear(); ExecutionContext ec = op.getExecutionContext(); Iterator elementsIter = iterator(op); if (elementsIter != null) { while (elementsIter.hasNext()) { Object element = elementsIter.next(); if (ec.getApiAdapter().isPersistable(element) && ec.getApiAdapter().isDeleted(element)) { // Element is waiting to be deleted so flush it (it has the FK) ObjectProvider elementSM = ec.findObjectProvider(element); elementSM.flush(); } else { if (deleteElements) { ec.deleteObjectInternal(element); } else { // TODO Null this out (in parent) } } } } }
public static Key getKeyForObject(Object pc, ExecutionContext ec) { AbstractClassMetaData cmd = ec.getMetaDataManager().getMetaDataForClass(pc.getClass(), ec.getClassLoaderResolver()); if (cmd.getIdentityType() == IdentityType.DATASTORE) { OID oid = (OID)ec.getApiAdapter().getIdForObject(pc); if (oid == null) { // Not yet persistent, so return null return null; } Object keyValue = oid.getKeyValue(); return EntityUtils.getPkAsKey(keyValue, cmd, ec); } else { // TODO Cater for composite identity Object internalPk = ec.getApiAdapter().getTargetKeyForSingleFieldIdentity(ec.getApiAdapter().getIdForObject(pc)); if (internalPk == null) { // Not yet persistent, so return null return null; } return EntityUtils.getPkAsKey(internalPk, ec.getMetaDataManager().getMetaDataForClass(pc.getClass(), ec.getClassLoaderResolver()), ec); } }
public static List<?> newStreamingQueryResultForEntities( Iterable<Entity> entities, final Function<Entity, Object> resultTransformer, Cursor endCursor, AbstractJavaQuery query) { final RuntimeExceptionWrappingIterable iterable; final ApiAdapter api = query.getExecutionContext().getApiAdapter(); if (entities instanceof QueryResultIterable) { // need to wrap it in a specialization so that CursorHelper can reach in iterable = new RuntimeExceptionWrappingIterable(api, (QueryResultIterable<Entity>) entities) { @Override Iterator<Entity> newIterator(Iterator<Entity> innerIter) { return new RuntimeExceptionWrappingQueryResultIterator(api, this, (QueryResultIterator<Entity>) innerIter); } }; } else { iterable = new RuntimeExceptionWrappingIterable(api, entities); } return new StreamingQueryResult(query, iterable, resultTransformer, endCursor); }
if (ec.getApiAdapter().isDetached(element)) {// User passed in detached object to collection.remove()! { elementToRemove = ec.findObject(ec.getApiAdapter().getIdForObject(element), true, false, element.getClass().getName()); if (!ec.getApiAdapter().isDeleted(elementToRemove)) { ec.getApiAdapter().isLoaded(elementOP, elemOwnerFieldNumber); oldOwner = elementOP.provideField(elemOwnerFieldNumber); if (ec.getApiAdapter().isPersistable(elementToRemove) && ec.getApiAdapter().isDeleted(elementToRemove)) {
public Iterator iterator(ObjectProvider op) { ExecutionContext ec = op.getExecutionContext(); if (MetaDataUtils.readRelatedKeysFromParent(storeMgr, ownerMemberMetaData)) { // Get child keys from property in owner Entity if the property exists Entity datastoreEntity = getOwnerEntity(op); String propName = EntityUtils.getPropertyName(storeMgr.getIdentifierFactory(), ownerMemberMetaData); if (datastoreEntity.hasProperty(propName)) { return getChildrenFromParentField(op, ec, -1, -1).listIterator(); } else { if (MetaDataUtils.isOwnedRelation(ownerMemberMetaData, storeMgr)) { // Not yet got the property in the parent, so this entity has not yet been migrated to latest storage version NucleusLogger.PERSISTENCE.info("Collection at field " + ownerMemberMetaData.getFullFieldName() + " of " + op + " not yet migrated to latest storage version, so reading elements via the parent key"); } } } if (MetaDataUtils.isOwnedRelation(ownerMemberMetaData, storeMgr)) { // Get child keys by doing a query with the owner as the parent Entity ApiAdapter apiAdapter = ec.getApiAdapter(); Key parentKey = EntityUtils.getPrimaryKeyAsKey(apiAdapter, op); return getChildrenUsingParentQuery(parentKey, Collections.<Query.FilterPredicate>emptyList(), Collections.<Query.SortPredicate>emptyList(), ec).iterator(); } else { return Utils.newArrayList().listIterator(); } }
for (int i=0;i<Array.getLength(arr);i++) { Object obj = Array.get(arr, i); if (!ec.getApiAdapter().isDeleted(obj)) { Key key = EntityUtils.extractChildKey(obj, ec, owned ? datastoreEntity : null); if (key != null) {
if (ec.getApiAdapter().isDeleted(pc)) { if (ec.getApiAdapter().isDetached(pc)) { Object primaryKey = ec.getApiAdapter().getTargetKeyForSingleFieldIdentity(childOP.getInternalObjectId()); if (primaryKey == null) {
List<Key> keys = Utils.newArrayList(); for (Object obj : coll) { if (!ec.getApiAdapter().isDeleted(obj)) { Key key = EntityUtils.extractChildKey(obj, ec, owned ? datastoreEntity : null); if (key != null) {
Key parentKey = EntityUtils.getPrimaryKeyAsKey(ec.getApiAdapter(), op); return getChildrenUsingParentQuery(parentKey, getFilterPredicates(startIdx, endIdx), getSortPredicates(), ec).listIterator(); } else {
public int lastIndexOf(ObjectProvider op, Object element) { ExecutionContext ec = op.getExecutionContext(); validateElementForReading(ec, element); ObjectProvider elementOP = ec.findObjectProvider(element); Key elementKey = EntityUtils.getPrimaryKeyAsKey(ec.getApiAdapter(), elementOP); if (elementKey == null) { // Not persistent return -1; } if (MetaDataUtils.readRelatedKeysFromParent(storeMgr, ownerMemberMetaData)) { // Return the position using the field of List<Key> in the owner String propName = EntityUtils.getPropertyName(storeMgr.getIdentifierFactory(), ownerMemberMetaData); Entity ownerEntity = getOwnerEntity(op); if (ownerEntity.hasProperty(propName)) { Object value = ownerEntity.getProperty(propName); if (value == null) { return -1; } List<Key> keys = (List<Key>) value; return keys.lastIndexOf(elementKey); } } // Owned relation in earlier storage version so use parentKey to determine membership of list (only present once) return indexOf(op, element); }
public static Key getPkAsKey(ObjectProvider op) { if (op.getClassMetaData().getIdentityType() == IdentityType.DATASTORE) { OID oid = (OID)op.getInternalObjectId(); Object keyValue = oid.getKeyValue(); return EntityUtils.getPkAsKey(keyValue, op.getClassMetaData(), op.getExecutionContext()); } else { // TODO Support composite PK Object pk = op.getExecutionContext().getApiAdapter().getTargetKeyForSingleFieldIdentity(op.getInternalObjectId()); if (pk == null) { throw new IllegalStateException("Primary key for object of type " + op.getClassMetaData().getName() + " is null."); } return EntityUtils.getPkAsKey(pk, op.getClassMetaData(), op.getExecutionContext()); } }
if (elementOP != null && !ec.getApiAdapter().isDeleted(element)) { Entity elementEntity = getOwnerEntity(elementOP); if (!storeMgr.storageVersionAtLeast(StorageVersion.READ_OWNED_CHILD_KEYS_FROM_PARENTS)) { storeMgr.getIdentifierFactory().newDatastoreContainerIdentifier(acmd).getIdentifierName(); Query q = new Query(kind); Key key = EntityUtils.getPrimaryKeyAsKey(ec.getApiAdapter(), ownerOP); q.setAncestor(key);
protected int[] internalShift(ObjectProvider op, boolean batched, int oldIndex, int amount) throws MappedDatastoreException { if (orderMapping == null) { return null; } DatastoreServiceConfig config = storeMgr.getDefaultDatastoreServiceConfigForReads(); DatastoreService service = DatastoreServiceFactoryInternal.getDatastoreService(config); AbstractClassMetaData acmd = elementCmd; String kind = storeMgr.getIdentifierFactory().newDatastoreContainerIdentifier(acmd).getIdentifierName(); Query q = new Query(kind); ExecutionContext ec = op.getExecutionContext(); Object id = ec.getApiAdapter().getTargetKeyForSingleFieldIdentity(op.getInternalObjectId()); Key key = id instanceof Key ? (Key) id : KeyFactory.stringToKey((String) id); q.setAncestor(key); // create an entity just to capture the name of the index property Entity entity = new Entity(kind); orderMapping.setObject(ec, entity, new int[] {1}, oldIndex); String indexProp = entity.getProperties().keySet().iterator().next(); q.addFilter(indexProp, Query.FilterOperator.GREATER_THAN_OR_EQUAL, oldIndex); for (Entity shiftMe : service.prepare(service.getCurrentTransaction(null), q).asIterable()) { Long pos = (Long) shiftMe.getProperty(indexProp); shiftMe.setProperty(indexProp, pos + amount); EntityUtils.putEntityIntoDatastore(ec, shiftMe); } return null; }
return false; Key parentKey = EntityUtils.getPrimaryKeyAsKey(ec.getApiAdapter(), op); return childKey.getParent().equals(parentKey);
Key elementKey = EntityUtils.getPrimaryKeyAsKey(ec.getApiAdapter(), elementOP); if (elementKey == null) {
ApiAdapter apiAdapter = ec.getApiAdapter();
ObjectProvider mergeOP = ec.findObjectProvider(parentPojo); if (mergeOP != null) { parentKey = EntityUtils.getPrimaryKeyAsKey(ec.getApiAdapter(), mergeOP);