use of org.springframework.cloud.gcp.data.spanner.core.convert.SpannerCustomConverter 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