use of org.springframework.cloud.gcp.data.spanner.core.mapping.SpannerPersistentEntity in project spring-cloud-gcp by spring-cloud.
the class AbstractSpannerIntegrationTest method createDummyEntity.
protected <T> SpannerPersistentEntity createDummyEntity(Class<T> type) {
TypeInformation<T> typeInformation = mock(TypeInformation.class);
when(typeInformation.getType()).thenReturn(type);
SpannerPersistentEntity dummyTrade = new SpannerPersistentEntityImpl<>(typeInformation);
dummyTrade.setApplicationContext(this.applicationContext);
return dummyTrade;
}
use of org.springframework.cloud.gcp.data.spanner.core.mapping.SpannerPersistentEntity in project spring-cloud-gcp by spring-cloud.
the class SpannerTemplate method read.
@Override
public <T> List<T> read(Class<T> entityClass, KeySet keys, SpannerReadOptions options) {
SpannerPersistentEntity<T> persistentEntity = (SpannerPersistentEntity<T>) this.mappingContext.getPersistentEntity(entityClass);
List<T> entities;
if (persistentEntity.hasEagerlyLoadedProperties() || persistentEntity.hasWhere()) {
entities = executeReadQueryAndResolveChildren(keys, persistentEntity, toQueryOption(keys, options), options != null ? options.getIndex() : null);
} else {
entities = mapToListAndResolveChildren(executeRead(persistentEntity.tableName(), keys, persistentEntity.columns(), options), entityClass, (options != null) ? options.getIncludeProperties() : null, options != null && options.isAllowPartialRead());
}
maybeEmitEvent(new AfterReadEvent(entities, keys, options));
return entities;
}
use of org.springframework.cloud.gcp.data.spanner.core.mapping.SpannerPersistentEntity in project spring-cloud-gcp by spring-cloud.
the class SqlSpannerQuery method executeReadSql.
private List executeReadSql(Pageable pageable, Sort sort, QueryTagValue queryTagValue) {
SpannerPageableQueryOptions spannerQueryOptions = new SpannerPageableQueryOptions().setAllowPartialRead(true);
if (sort != null && sort.isSorted()) {
spannerQueryOptions.setSort(sort);
}
if (pageable != null && pageable.isPaged()) {
spannerQueryOptions.setOffset(pageable.getOffset()).setLimit(pageable.getPageSize());
}
final Class<?> returnedType = getReturnedType();
final SpannerPersistentEntity<?> entity = returnedType == null ? null : this.spannerMappingContext.getPersistentEntity(returnedType);
queryTagValue.sql = SpannerStatementQueryExecutor.applySortingPagingQueryOptions(this.entityType, spannerQueryOptions, queryTagValue.sql, this.spannerMappingContext, entity != null && entity.hasEagerlyLoadedProperties());
Statement statement = buildStatementFromQueryAndTags(queryTagValue);
return (getReturnedSimpleConvertableItemType() != null) ? this.spannerTemplate.query((struct) -> new StructAccessor(struct).getSingleValue(0), statement, spannerQueryOptions) : this.spannerTemplate.query(this.entityType, statement, spannerQueryOptions);
}
use of org.springframework.cloud.gcp.data.spanner.core.mapping.SpannerPersistentEntity in project spring-cloud-gcp by spring-cloud.
the class SpannerQueryLookupStrategyTests method getColumnsStringForSelectMultipleTest.
@Test
@SuppressWarnings("unchecked")
public void getColumnsStringForSelectMultipleTest() {
final SpannerPersistentEntity<TestEntity> entity = (SpannerPersistentEntity<TestEntity>) this.spannerMappingContext.getPersistentEntity(TestEntity.class);
Statement childrenRowsQuery = SpannerStatementQueryExecutor.buildQuery(KeySet.newBuilder().addKey(Key.of("k1.1", "k1.2")).addKey(Key.of("k2.1", "k2.2")).build(), entity, new SpannerWriteConverter(), this.spannerMappingContext, entity.getWhere());
assertThat(childrenRowsQuery.getSql()).isEqualTo("SELECT other, deleted, id, custom_col, id_2, ARRAY (SELECT AS STRUCT deleted, id3, id, id_2 " + "FROM child_test_table WHERE (child_test_table.id = custom_test_table.id " + "AND child_test_table.id_2 = custom_test_table.id_2) AND (deleted = false)) AS childEntities " + "FROM custom_test_table WHERE ((id = @tag0 AND id_2 = @tag1) " + "OR (id = @tag2 AND id_2 = @tag3)) AND (deleted = false)");
}
use of org.springframework.cloud.gcp.data.spanner.core.mapping.SpannerPersistentEntity in project spring-cloud-gcp by spring-cloud.
the class SpannerStatementQueryExecutor method buildQuery.
/**
* Builds a query that returns the rows associated with a key set with additional SQL-where.
* The {@link org.springframework.cloud.gcp.data.spanner.core.mapping.Where} of the {@code persistentEntity} parameter
* is ignored, you should pass the SQL-where as a {@code whereClause} parameter.
* The secondary {@code index} will be used instead of the table name when the corresponding parameter is not null.
* @param keySet the key set whose members to get.
* @param persistentEntity the persistent entity of the table.
* @param <T> the type of the persistent entity
* @param writeConverter a converter to convert key values as needed to bind to the query statement.
* @param mappingContext mapping context
* @param whereClause SQL where clause
* @param index the secondary index name
* @return the Spanner statement to perform the retrieval.
*/
public static <T> Statement buildQuery(KeySet keySet, SpannerPersistentEntity<T> persistentEntity, SpannerCustomConverter writeConverter, SpannerMappingContext mappingContext, String whereClause, String index) {
List<String> orParts = new ArrayList<>();
List<String> tags = new ArrayList<>();
List keyParts = new ArrayList();
int tagNum = 0;
List<SpannerPersistentProperty> keyProperties = persistentEntity.getFlattenedPrimaryKeyProperties();
for (Key key : keySet.getKeys()) {
StringJoiner andJoiner = new StringJoiner(" AND ");
Iterator parentKeyParts = key.getParts().iterator();
while (parentKeyParts.hasNext()) {
SpannerPersistentProperty keyProp = keyProperties.get(tagNum % keyProperties.size());
String tagName = "tag" + tagNum;
andJoiner.add(keyProp.getColumnName() + " = @" + tagName);
tags.add(tagName);
keyParts.add(parentKeyParts.next());
tagNum++;
}
orParts.add(andJoiner.toString());
}
String keyClause = orParts.stream().map(s -> "(" + s + ")").collect(Collectors.joining(" OR "));
String condition = combineWithAnd(keyClause, whereClause);
String sb = "SELECT " + getColumnsStringForSelect(persistentEntity, mappingContext, true) + " FROM " + (StringUtils.isEmpty(index) ? persistentEntity.tableName() : String.format("%s@{FORCE_INDEX=%s}", persistentEntity.tableName(), index)) + (condition.isEmpty() ? "" : " WHERE " + condition);
return buildStatementFromSqlWithArgs(sb, tags, null, writeConverter, keyParts.toArray(), null);
}
Aggregations