/** * 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())); }
@VisibleForTesting boolean isNonEntityReturnedType(Class returnedType) { return this.datastoreTemplate.getDatastoreEntityConverter().getConversions() .getDatastoreCompatibleType(returnedType).isPresent(); }
public DefaultDatastoreEntityConverter(DatastoreMappingContext mappingContext, ReadWriteConversions conversions) { this.mappingContext = mappingContext; this.conversions = conversions; conversions.registerEntityConverter(this); }
@Override public <T, R> Map<T, R> readAsMap(Class<T> keyType, TypeInformation<R> componentType, BaseEntity entity) { if (entity == null) { return null; } Map<T, R> result = new HashMap<>(); EntityPropertyValueProvider propertyValueProvider = new EntityPropertyValueProvider( entity, this.conversions); Set<String> fieldNames = entity.getNames(); for (String field : fieldNames) { result.put(this.conversions.convertOnRead(field, null, keyType), propertyValueProvider.getPropertyValue(field, EmbeddedType.of(componentType), componentType)); } return result; }
@Override @SuppressWarnings("unchecked") public void write(Object source, BaseEntity.Builder sink) { DatastorePersistentEntity<?> persistentEntity = this.mappingContext.getPersistentEntity(source.getClass()); PersistentPropertyAccessor accessor = persistentEntity.getPropertyAccessor(source); persistentEntity.doWithColumnBackedProperties( (DatastorePersistentProperty persistentProperty) -> { try { Object val = accessor.getProperty(persistentProperty); Value convertedVal = this.conversions.convertOnWrite(val, persistentProperty); if (persistentProperty.isUnindexed()) { ValueBuilder valueBuilder = convertedVal.toBuilder(); valueBuilder.setExcludeFromIndexes(true); convertedVal = valueBuilder.build(); } sink.set(persistentProperty.getFieldName(), convertedVal); } catch (DatastoreDataException ex) { throw new DatastoreDataException( "Unable to write " + persistentEntity.kindName() + "." + persistentProperty.getFieldName(), ex); } }); } }
@Override public <T, R> Map<T, R> readAsMap(Class<T> keyType, TypeInformation<R> componentType, BaseEntity entity) { if (entity == null) { return null; } Map<T, R> result = new HashMap<>(); EntityPropertyValueProvider propertyValueProvider = new EntityPropertyValueProvider( entity, this.conversions); Set<String> fieldNames = entity.getNames(); for (String field : fieldNames) { result.put(this.conversions.convertOnRead(field, null, keyType), propertyValueProvider.getPropertyValue(field, EmbeddedType.of(componentType), componentType)); } return result; }
@Override @SuppressWarnings("unchecked") public void write(Object source, BaseEntity.Builder sink) { DatastorePersistentEntity<?> persistentEntity = this.mappingContext.getPersistentEntity(source.getClass()); PersistentPropertyAccessor accessor = persistentEntity.getPropertyAccessor(source); persistentEntity.doWithColumnBackedProperties( (DatastorePersistentProperty persistentProperty) -> { try { Object val = accessor.getProperty(persistentProperty); Value convertedVal = this.conversions.convertOnWrite(val, persistentProperty); if (persistentProperty.isUnindexed()) { ValueBuilder valueBuilder = convertedVal.toBuilder(); valueBuilder.setExcludeFromIndexes(true); convertedVal = valueBuilder.build(); } sink.set(persistentProperty.getFieldName(), convertedVal); } catch (DatastoreDataException ex) { throw new DatastoreDataException( "Unable to write " + persistentEntity.kindName() + "." + persistentProperty.getFieldName(), ex); } }); } }
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)); }
/** * 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())); }
public DefaultDatastoreEntityConverter(DatastoreMappingContext mappingContext, ReadWriteConversions conversions) { this.mappingContext = mappingContext; this.conversions = conversions; conversions.registerEntityConverter(this); }
boolean isNonEntityReturnedType(Class returnedType) { return this.datastoreTemplate.getDatastoreEntityConverter().getConversions() .getDatastoreCompatibleType(returnedType).isPresent(); }
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)); }
@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); }
@VisibleForTesting protected Object convertResultCollection(Object result, Class<?> collectionType) { return getDatastoreTemplate().getDatastoreEntityConverter().getConversions() .convertOnRead(result, collectionType, getQueryMethod().getReturnedObjectType()); }
@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 convertCollectionResult(Class returnedItemType, boolean isNonEntityReturnType, List rawResult) { Object result = this.datastoreTemplate.getDatastoreEntityConverter() .getConversions().convertOnRead( isNonEntityReturnType ? rawResult : applyProjection(rawResult), this.queryMethod.getCollectionReturnType(), returnedItemType); return result; }
case SIMPLE_PROPERTY: filter = PropertyFilter.eq(fieldName, converter.convertOnWriteSingle(it.next())); equalityComparedFields.add(fieldName); break; case GREATER_THAN_EQUAL: filter = PropertyFilter.ge(fieldName, converter.convertOnWriteSingle(it.next())); break; case GREATER_THAN: filter = PropertyFilter.gt(fieldName, converter.convertOnWriteSingle(it.next())); break; case LESS_THAN_EQUAL: filter = PropertyFilter.le(fieldName, converter.convertOnWriteSingle(it.next())); break; case LESS_THAN: filter = PropertyFilter.lt(fieldName, converter.convertOnWriteSingle(it.next())); break; default:
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(); }
@SuppressWarnings("unchecked") public <T> T getPropertyValue(String fieldName, EmbeddedType embeddedType, TypeInformation targetTypeInformation) { if (!this.entity.contains(fieldName)) { return null; } try { return this.conversion.convertOnRead(this.entity.getValue(fieldName).get(), embeddedType, targetTypeInformation); } catch (ConversionException | DatastoreDataException ex) { throw new DatastoreDataException("Unable to read property " + fieldName, ex); } } }