@VisibleForTesting boolean isNonEntityReturnedType(Class returnedType) { return this.datastoreTemplate.getDatastoreEntityConverter().getConversions() .getDatastoreCompatibleType(returnedType).isPresent(); }
/** * Convert collection-like param from the query method into an array of compatible types * for Datastore. * @param param the raw param * @return an array of a compatible type. */ protected Object[] convertCollectionParamToCompatibleArray(List<?> param) { List converted = param.stream() .map((x) -> this.datastoreTemplate.getDatastoreEntityConverter().getConversions().convertOnWriteSingle(x) .get()) .collect(Collectors.toList()); return converted.toArray( (Object[]) Array.newInstance(converted.isEmpty() ? String.class // if there are no items in the param : converted.get(0).getClass(), converted.size())); }
boolean isNonEntityReturnedType(Class returnedType) { return this.datastoreTemplate.getDatastoreEntityConverter().getConversions() .getDatastoreCompatibleType(returnedType).isPresent(); }
/** * Convert collection-like param from the query method into an array of compatible types * for Datastore. * @param param the raw param * @return an array of a compatible type. */ protected Object[] convertCollectionParamToCompatibleArray(List<?> param) { List converted = param.stream() .map((x) -> this.datastoreTemplate.getDatastoreEntityConverter().getConversions().convertOnWriteSingle(x) .get()) .collect(Collectors.toList()); return converted.toArray( (Object[]) Array.newInstance(converted.isEmpty() ? String.class // if there are no items in the param : converted.get(0).getClass(), converted.size())); }
@Override public <V> void writeMap(Key datastoreKey, Map<String, V> map) { Assert.notNull(datastoreKey, "A non-null Key is required."); Assert.notNull(map, "A non-null map is required."); Builder builder = Entity.newBuilder(datastoreKey); map.forEach( (key, value) -> builder.set(key, this.datastoreEntityConverter.getConversions().convertOnWriteSingle(value))); Entity entity = builder.build(); getDatastoreReadWriter().put(entity); }
@Override public <V> void writeMap(Key datastoreKey, Map<String, V> map) { Assert.notNull(datastoreKey, "A non-null Key is required."); Assert.notNull(map, "A non-null map is required."); Builder builder = Entity.newBuilder(datastoreKey); map.forEach( (key, value) -> builder.set(key, this.datastoreEntityConverter.getConversions().convertOnWriteSingle(value))); Entity entity = builder.build(); getDatastoreReadWriter().put(entity); }
private Object convertSingularResult(Class returnedItemType, boolean isNonEntityReturnType, List rawResult) { if (this.queryMethod.isCountQuery()) { return rawResult.size(); } else if (this.queryMethod.isExistsQuery()) { return !rawResult.isEmpty(); } if (rawResult.size() > 1) { throw new DatastoreDataException( "The query method returns a singular object but " + "the query returned more than one result."); } return isNonEntityReturnType ? this.datastoreTemplate.getDatastoreEntityConverter().getConversions() .convertOnRead(rawResult.get(0), null, returnedItemType) : this.queryMethod.getResultProcessor().processResult(rawResult.get(0)); }
private Object convertSingularResult(Class returnedItemType, boolean isNonEntityReturnType, List rawResult) { if (this.queryMethod.isCountQuery()) { return rawResult.size(); } else if (this.queryMethod.isExistsQuery()) { return !rawResult.isEmpty(); } if (rawResult.size() > 1) { throw new DatastoreDataException( "The query method returns a singular object but " + "the query returned more than one result."); } return isNonEntityReturnType ? this.datastoreTemplate.getDatastoreEntityConverter().getConversions() .convertOnRead(rawResult.get(0), null, returnedItemType) : this.queryMethod.getResultProcessor().processResult(rawResult.get(0)); }
@VisibleForTesting protected Object convertResultCollection(Object result, Class<?> collectionType) { return getDatastoreTemplate().getDatastoreEntityConverter().getConversions() .convertOnRead(result, collectionType, getQueryMethod().getReturnedObjectType()); }
private Object convertCollectionResult(Class returnedItemType, boolean isNonEntityReturnType, List rawResult) { Object result = this.datastoreTemplate.getDatastoreEntityConverter() .getConversions().convertOnRead( isNonEntityReturnType ? rawResult : applyProjection(rawResult), this.queryMethod.getCollectionReturnType(), returnedItemType); return result; }
private Object convertCollectionResult(Class returnedItemType, boolean isNonEntityReturnType, List rawResult) { Object result = this.datastoreTemplate.getDatastoreEntityConverter() .getConversions().convertOnRead( isNonEntityReturnType ? rawResult : applyProjection(rawResult), this.queryMethod.getCollectionReturnType(), returnedItemType); return result; }
private GqlQuery<? extends BaseEntity> bindArgsToGqlQuery(String gql, List<String> tags, List vals) { Builder builder = GqlQuery.newGqlQueryBuilder(gql); builder.setAllowLiteral(true); if (tags.size() != vals.size()) { throw new DatastoreDataException("Annotated GQL Query Method " + this.queryMethod.getName() + " has " + tags.size() + " tags but a different number of parameter values: " + vals.size()); } for (int i = 0; i < tags.size(); i++) { Object val = vals.get(i); Object boundVal; if (ValueUtil.isCollectionLike(val.getClass())) { boundVal = convertCollectionParamToCompatibleArray((List) ValueUtil.toListIfArray(val)); } else { boundVal = this.datastoreTemplate.getDatastoreEntityConverter().getConversions() .convertOnWriteSingle(val).get(); } DatastoreNativeTypes.bindValueToGqlBuilder(builder, tags.get(i), boundVal); } return builder.build(); }
private GqlQuery<? extends BaseEntity> bindArgsToGqlQuery(String gql, List<String> tags, List vals) { Builder builder = GqlQuery.newGqlQueryBuilder(gql); builder.setAllowLiteral(true); if (tags.size() != vals.size()) { throw new DatastoreDataException("Annotated GQL Query Method " + this.queryMethod.getName() + " has " + tags.size() + " tags but a different number of parameter values: " + vals.size()); } for (int i = 0; i < tags.size(); i++) { Object val = vals.get(i); Object boundVal; if (ValueUtil.isCollectionLike(val.getClass())) { boundVal = convertCollectionParamToCompatibleArray((List) ValueUtil.toListIfArray(val)); } else { boundVal = this.datastoreTemplate.getDatastoreEntityConverter().getConversions() .convertOnWriteSingle(val).get(); } DatastoreNativeTypes.bindValueToGqlBuilder(builder, tags.get(i), boundVal); } return builder.build(); }
protected Object convertResultCollection(Object result, Class<?> collectionType) { return getDatastoreTemplate().getDatastoreEntityConverter().getConversions() .convertOnRead(result, collectionType, getQueryMethod().getReturnedObjectType()); }
private Object findReferenced(BaseEntity entity, DatastorePersistentProperty referencePersistentProperty) { String fieldName = referencePersistentProperty.getFieldName(); try { Object referenced; if (!entity.contains(fieldName)) { referenced = null; } else if (referencePersistentProperty.isCollectionLike()) { Class referencedType = referencePersistentProperty.getComponentType(); List<Value<Key>> keyValues = entity.getList(fieldName); referenced = this.datastoreEntityConverter.getConversions() .convertOnRead( findAllById( keyValues.stream().map(Value::get).collect(Collectors.toList()), referencedType), referencePersistentProperty.getType(), referencedType); } else { referenced = findById(entity.getKey(fieldName), referencePersistentProperty.getType()); } return referenced; } catch (ClassCastException ex) { throw new DatastoreDataException( "Error loading reference property " + fieldName + "." + "Reference properties must be stored as Keys or lists of Keys" + " in Cloud Datastore for singular or multiple references, respectively."); } }
private Object findReferenced(BaseEntity entity, DatastorePersistentProperty referencePersistentProperty) { String fieldName = referencePersistentProperty.getFieldName(); try { Object referenced; if (!entity.contains(fieldName)) { referenced = null; } else if (referencePersistentProperty.isCollectionLike()) { Class referencedType = referencePersistentProperty.getComponentType(); List<Value<Key>> keyValues = entity.getList(fieldName); referenced = this.datastoreEntityConverter.getConversions() .convertOnRead( findAllById( keyValues.stream().map(Value::get).collect(Collectors.toList()), referencedType), referencePersistentProperty.getType(), referencedType); } else { referenced = findById(entity.getKey(fieldName), referencePersistentProperty.getType()); } return referenced; } catch (ClassCastException ex) { throw new DatastoreDataException( "Error loading reference property " + fieldName + "." + "Reference properties must be stored as Keys or lists of Keys" + " in Cloud Datastore for singular or multiple references, respectively."); } }
try { ReadWriteConversions converter = this.datastoreTemplate.getDatastoreEntityConverter().getConversions();
try { ReadWriteConversions converter = this.datastoreTemplate.getDatastoreEntityConverter().getConversions();
private <T> void resolveDescendantProperties(DatastorePersistentEntity datastorePersistentEntity, BaseEntity entity, T convertedObject) { datastorePersistentEntity .doWithDescendantProperties((descendantPersistentProperty) -> { Class descendantType = descendantPersistentProperty .getComponentType(); EntityQuery descendantQuery = Query.newEntityQueryBuilder() .setKind(this.datastoreMappingContext .getPersistentEntity(descendantType).kindName()) .setFilter(PropertyFilter.hasAncestor((Key) entity.getKey())) .build(); datastorePersistentEntity.getPropertyAccessor(convertedObject) .setProperty(descendantPersistentProperty, // Converting the collection type. this.datastoreEntityConverter.getConversions() .convertOnRead( convertEntitiesForRead( getDatastoreReadWriter() .run(descendantQuery), descendantType), descendantPersistentProperty .getType(), descendantType)); }); }
private <T> void resolveDescendantProperties(DatastorePersistentEntity datastorePersistentEntity, BaseEntity entity, T convertedObject) { datastorePersistentEntity .doWithDescendantProperties((descendantPersistentProperty) -> { Class descendantType = descendantPersistentProperty .getComponentType(); EntityQuery descendantQuery = Query.newEntityQueryBuilder() .setKind(this.datastoreMappingContext .getPersistentEntity(descendantType).kindName()) .setFilter(PropertyFilter.hasAncestor((Key) entity.getKey())) .build(); datastorePersistentEntity.getPropertyAccessor(convertedObject) .setProperty(descendantPersistentProperty, // Converting the collection type. this.datastoreEntityConverter.getConversions() .convertOnRead( convertEntitiesForRead( getDatastoreReadWriter() .run(descendantQuery), descendantType), descendantPersistentProperty .getType(), descendantType)); }); }