use of com.blazebit.persistence.view.impl.objectbuilder.mapper.TupleElementMapper in project blaze-persistence by Blazebit.
the class ViewTypeObjectBuilderTemplate method applyCollectionFunctionMapping.
private void applyCollectionFunctionMapping(BasicUserTypeStringSupport<?> basicUserTypeStringSupport, MappingAttribute<? super T, ?> mappingAttribute, String attributePath, TupleElementMapperBuilder mapperBuilder, String[] fetches, EmbeddingViewJpqlMacro embeddingViewJpqlMacro) {
String expression = "VALUE(" + mapperBuilder.getMapping(mappingAttribute) + ")";
String alias = mapperBuilder.getAlias(mappingAttribute, false);
TupleElementMapper mapper = createMapper(basicUserTypeStringSupport, expression, alias, attributePath, mapperBuilder.getMapping(), embeddingViewJpqlMacro.getEmbeddingViewPath(), fetches);
mapperBuilder.addMapper(mapper);
}
use of com.blazebit.persistence.view.impl.objectbuilder.mapper.TupleElementMapper in project blaze-persistence by Blazebit.
the class ViewTypeObjectBuilderTemplate method applySubqueryMapping.
private void applySubqueryMapping(SubqueryAttribute<?, ?> attribute, String attributePath, TupleElementMapperBuilder mapperBuilder, EmbeddingViewJpqlMacro embeddingViewJpqlMacro) {
SubqueryProviderFactory factory = attribute.getSubqueryProviderFactory();
String alias = mapperBuilder.getAlias(attribute, false);
String subqueryAlias = attribute.getSubqueryAlias();
String viewPath = mapperBuilder.getMapping();
String subqueryExpression = attribute.getSubqueryExpression();
TupleElementMapper mapper;
if (subqueryExpression.isEmpty()) {
if (alias != null) {
if (factory.isParameterized()) {
mapper = new ParameterizedAliasSubqueryTupleElementMapper(attribute.getType(), factory, attributePath, viewPath, embeddingViewJpqlMacro.getEmbeddingViewPath(), alias);
} else {
mapper = new AliasSubqueryTupleElementMapper(attribute.getType(), factory.create(null, null), attributePath, viewPath, embeddingViewJpqlMacro.getEmbeddingViewPath(), alias);
}
} else {
if (factory.isParameterized()) {
mapper = new ParameterizedSubqueryTupleElementMapper(attribute.getType(), factory, attributePath, viewPath, embeddingViewJpqlMacro.getEmbeddingViewPath());
} else {
mapper = new SimpleSubqueryTupleElementMapper(attribute.getType(), factory.create(null, null), attributePath, viewPath, embeddingViewJpqlMacro.getEmbeddingViewPath());
}
}
} else {
subqueryExpression = mapperBuilder.getMapping(attribute);
if (alias != null) {
if (factory.isParameterized()) {
mapper = new ParameterizedAliasExpressionSubqueryTupleElementMapper(attribute.getType(), factory, subqueryExpression, subqueryAlias, attributePath, viewPath, embeddingViewJpqlMacro.getEmbeddingViewPath(), alias);
} else {
mapper = new AliasExpressionSubqueryTupleElementMapper(attribute.getType(), factory.create(null, null), subqueryExpression, subqueryAlias, attributePath, viewPath, embeddingViewJpqlMacro.getEmbeddingViewPath(), alias);
}
} else {
if (factory.isParameterized()) {
mapper = new ParameterizedExpressionSubqueryTupleElementMapper(attribute.getType(), factory, subqueryExpression, subqueryAlias, attributePath, viewPath, embeddingViewJpqlMacro.getEmbeddingViewPath());
} else {
mapper = new ExpressionSubqueryTupleElementMapper(attribute.getType(), factory.create(null, null), subqueryExpression, subqueryAlias, attributePath, viewPath, embeddingViewJpqlMacro.getEmbeddingViewPath());
}
}
}
mapperBuilder.addMapper(mapper);
}
use of com.blazebit.persistence.view.impl.objectbuilder.mapper.TupleElementMapper in project blaze-persistence by Blazebit.
the class ViewTypeObjectBuilderTemplate method applyIndexCollectionFunctionMapping.
private void applyIndexCollectionFunctionMapping(BasicUserTypeStringSupport<?> basicUserTypeStringSupport, MappingAttribute<? super T, ?> mappingAttribute, String attributePath, TupleElementMapperBuilder mapperBuilder, EmbeddingViewJpqlMacro embeddingViewJpqlMacro) {
String expression;
String[] fetches = EMPTY;
if (mappingAttribute instanceof MapAttribute<?, ?, ?>) {
expression = mapperBuilder.getKeyMapping((MapAttribute<?, ?, ?>) mappingAttribute);
fetches = ((MapAttribute<?, ?, ?>) mappingAttribute).getKeyFetches();
} else {
expression = mapperBuilder.getIndexMapping((ListAttribute<?, ?>) mappingAttribute);
}
String alias = mapperBuilder.getAlias(mappingAttribute, true);
TupleElementMapper mapper = createMapper(basicUserTypeStringSupport, expression, alias, attributePath, mapperBuilder.getMapping(), embeddingViewJpqlMacro.getEmbeddingViewPath(), fetches);
mapperBuilder.addMapper(mapper);
}
use of com.blazebit.persistence.view.impl.objectbuilder.mapper.TupleElementMapper in project blaze-persistence by Blazebit.
the class ViewTypeObjectBuilderTemplate method applyBasicCorrelatedMapping.
private void applyBasicCorrelatedMapping(AbstractAttribute<?, ?> attribute, String attributePath, TupleElementMapperBuilder mapperBuilder, Set<Feature> features, ExpressionFactory ef, int batchSize, boolean dirtyTracking, EmbeddingViewJpqlMacro embeddingViewJpqlMacro) {
Expression correlationResult = attribute.getCorrelationResultExpression();
CorrelationProviderFactory factory = attribute.getCorrelationProviderFactory();
String correlationBasis = attribute.getCorrelationBasis();
String correlationAlias = CorrelationProviderHelper.getDefaultCorrelationAlias(attributePath);
if (attribute.getFetchStrategy() == FetchStrategy.JOIN) {
String alias = mapperBuilder.getAlias(attribute, false);
correlationBasis = mapperBuilder.getMapping(attribute.getCorrelationBasisExpression());
TupleElementMapper mapper;
String joinBase = mapperBuilder.getMapping();
String joinCorrelationAttributePath = mapperBuilder.getJoinCorrelationAttributePath(attributePath);
String embeddingViewPath = joinBase;
if (factory.isParameterized()) {
mapper = new ParameterizedExpressionCorrelationJoinTupleElementMapper(factory, ef, joinBase, correlationBasis, attribute.getCorrelationResultExpression(), alias, joinCorrelationAttributePath, embeddingViewPath, attribute.getFetches(), createLimiter(mapperBuilder, correlationAlias, attribute), viewRoot.getEntityViewRootTypes().keySet());
} else {
mapper = new ExpressionCorrelationJoinTupleElementMapper(factory.create(null, null), ef, joinBase, correlationBasis, attribute.getCorrelationResultExpression(), alias, joinCorrelationAttributePath, embeddingViewPath, attribute.getFetches(), createLimiter(mapperBuilder, correlationAlias, attribute), viewRoot.getEntityViewRootTypes().keySet());
}
mapperBuilder.addMapper(mapper);
} else if (attribute.getFetchStrategy() == FetchStrategy.SELECT) {
String subviewAliasPrefix = mapperBuilder.getAlias(attribute, false);
int viewRootIndex = viewRoot.hasSubtypes() ? 1 : 0;
int embeddingViewIndex = tupleOffset;
int startIndex = tupleOffset + mapperBuilder.mapperIndex();
Class<?> correlationBasisType = getCorrelationBasisType(attribute.getCorrelationBasisExpression(), AbstractAttribute.stripThisFromMapping(correlationBasis), attribute.getDeclaringType().getEntityViewRootTypes());
Class<?> correlationBasisEntity = getCorrelationBasisEntityType(correlationBasisType);
String correlationBasisExpression = AbstractAttribute.stripThisFromMapping(correlationBasis);
String correlationKeyExpression = mapperBuilder.getMapping(attribute.getCorrelationBasisExpression(), correlationBasisEntity);
String embeddingViewPath = mapperBuilder.getMapping();
boolean correlatesThis = correlatesThis(evm, ef, managedTypeClass, attribute.getCorrelated(), correlationBasisExpression, attribute.getCorrelationPredicate(), attribute.getCorrelationKeyAlias());
BasicUserTypeStringSupport<Object> correlationKeyExpressionBasicTypeType = getCorrelationKeyExpressionBasicTypeSupport(correlationBasisType, correlationBasisEntity);
mapperBuilder.addMapper(createMapper(correlationKeyExpressionBasicTypeType, correlationKeyExpression, subviewAliasPrefix, attributePath, embeddingViewPath, embeddingViewJpqlMacro.getEmbeddingViewPath(), attribute.getFetches()));
// We need a special mapping for the VIEW_ROOT/EMBEDDING_VIEW macro in certain cases
viewRootIndex = addViewRootMappingIfNeeded(mapperBuilder, features, subviewAliasPrefix, attributePath, viewRootIndex);
embeddingViewIndex = addEmbeddingViewMappingIfNeeded(mapperBuilder, features, subviewAliasPrefix, attributePath, embeddingViewIndex);
if (batchSize == -1) {
batchSize = 1;
}
if (attribute.isCollection()) {
PluralAttribute<?, ?, ?> pluralAttribute = (PluralAttribute<?, ?, ?>) attribute;
String[] indexFetches = EMPTY;
Expression indexExpression = null;
Correlator indexCorrelator = null;
switch(pluralAttribute.getCollectionType()) {
case COLLECTION:
if (pluralAttribute.isSorted()) {
throw new IllegalArgumentException("The collection attribute '" + pluralAttribute + "' can not be sorted!");
}
break;
case LIST:
if (pluralAttribute.isSorted()) {
throw new IllegalArgumentException("The list attribute '" + pluralAttribute + "' can not be sorted!");
}
indexExpression = attribute.getMappingIndexExpression();
indexCorrelator = indexExpression == null ? null : new BasicCorrelator();
break;
case SET:
break;
case MAP:
MapAttribute<?, ?, ?> mapAttribute = (MapAttribute<?, ?, ?>) attribute;
indexExpression = attribute.getKeyMappingExpression();
indexFetches = mapAttribute.getKeyFetches();
if (mapAttribute.isKeySubview()) {
indexCorrelator = new SubviewCorrelator((ManagedViewTypeImplementor<?>) mapAttribute.getKeyType(), null, evm, subviewAliasPrefix, attributePath);
} else {
indexCorrelator = new BasicCorrelator();
}
mapperBuilder.addTupleListTransformerFactory(new CorrelatedMapBatchTupleListTransformerFactory(new BasicCorrelator(), viewRoot, viewType, correlationResult, factory, attributePath, attribute.getFetches(), correlatesThis, viewRootIndex, embeddingViewIndex, startIndex, batchSize, correlationBasisType, correlationBasisEntity, createLimiter(mapperBuilder, correlationAlias, attribute), indexFetches, indexExpression, indexCorrelator, attribute.getContainerAccumulator(), dirtyTracking));
return;
default:
throw new IllegalArgumentException("Unknown collection type: " + pluralAttribute.getCollectionType());
}
mapperBuilder.addTupleListTransformerFactory(new CorrelatedCollectionBatchTupleListTransformerFactory(new BasicCorrelator(), viewRoot, viewType, correlationResult, factory, attributePath, attribute.getFetches(), correlatesThis, viewRootIndex, embeddingViewIndex, startIndex, batchSize, correlationBasisType, correlationBasisEntity, createLimiter(mapperBuilder, correlationAlias, attribute), indexFetches, indexExpression, indexCorrelator, attribute.getContainerAccumulator(), dirtyTracking));
} else {
mapperBuilder.addTupleListTransformerFactory(new CorrelatedSingularBatchTupleListTransformerFactory(new BasicCorrelator(), viewRoot, viewType, correlationResult, factory, attributePath, attribute.getFetches(), correlatesThis, viewRootIndex, embeddingViewIndex, startIndex, batchSize, correlationBasisType, correlationBasisEntity, createLimiter(mapperBuilder, correlationAlias, attribute)));
}
} else if (attribute.getFetchStrategy() == FetchStrategy.SUBSELECT) {
String subviewAliasPrefix = mapperBuilder.getAlias(attribute, false);
int viewRootIndex = viewRoot.hasSubtypes() ? 1 : 0;
int embeddingViewIndex = tupleOffset;
int startIndex = tupleOffset + mapperBuilder.mapperIndex();
Class<?> correlationBasisType = getCorrelationBasisType(attribute.getCorrelationBasisExpression(), AbstractAttribute.stripThisFromMapping(correlationBasis), attribute.getDeclaringType().getEntityViewRootTypes());
Class<?> correlationBasisEntity = getCorrelationBasisEntityType(correlationBasisType);
String correlationBasisExpression = mapperBuilder.getMapping(attribute.getCorrelationBasisExpression());
String correlationKeyExpression = mapperBuilder.getMapping(attribute.getCorrelationBasisExpression(), correlationBasisEntity);
BasicUserTypeStringSupport<Object> correlationKeyExpressionBasicTypeType = getCorrelationKeyExpressionBasicTypeSupport(correlationBasisType, correlationBasisEntity);
String embeddingViewPath = mapperBuilder.getMapping();
mapperBuilder.addMapper(createMapper(correlationKeyExpressionBasicTypeType, correlationKeyExpression, subviewAliasPrefix, attributePath, embeddingViewPath, embeddingViewJpqlMacro.getEmbeddingViewPath(), attribute.getFetches()));
if (attribute.isCollection()) {
PluralAttribute<?, ?, ?> pluralAttribute = (PluralAttribute<?, ?, ?>) attribute;
String[] indexFetches = EMPTY;
Expression indexExpression = null;
Correlator indexCorrelator = null;
switch(pluralAttribute.getCollectionType()) {
case COLLECTION:
if (pluralAttribute.isSorted()) {
throw new IllegalArgumentException("The collection attribute '" + pluralAttribute + "' can not be sorted!");
}
break;
case LIST:
if (pluralAttribute.isSorted()) {
throw new IllegalArgumentException("The list attribute '" + pluralAttribute + "' can not be sorted!");
}
indexExpression = attribute.getMappingIndexExpression();
indexCorrelator = indexExpression == null ? null : new BasicCorrelator();
break;
case SET:
break;
case MAP:
MapAttribute<?, ?, ?> mapAttribute = (MapAttribute<?, ?, ?>) attribute;
indexExpression = attribute.getKeyMappingExpression();
indexFetches = mapAttribute.getKeyFetches();
if (mapAttribute.isKeySubview()) {
indexCorrelator = new SubviewCorrelator((ManagedViewTypeImplementor<?>) mapAttribute.getKeyType(), null, evm, subviewAliasPrefix, attributePath);
} else {
indexCorrelator = new BasicCorrelator();
}
mapperBuilder.addTupleTransformerFactory(new CorrelatedMapSubselectTupleTransformerFactory(new BasicCorrelator(), evm, viewRoot, viewRootAlias, viewType, embeddingViewPath, correlationResult, correlationBasisExpression, correlationKeyExpression, factory, attributePath, attribute.getFetches(), viewRootIndex, embeddingViewIndex, startIndex, correlationBasisType, correlationBasisEntity, createLimiter(mapperBuilder, correlationAlias, attribute), indexFetches, indexExpression, indexCorrelator, attribute.getContainerAccumulator(), dirtyTracking));
return;
default:
throw new IllegalArgumentException("Unknown collection type: " + pluralAttribute.getCollectionType());
}
mapperBuilder.addTupleTransformerFactory(new CorrelatedCollectionSubselectTupleTransformerFactory(new BasicCorrelator(), evm, viewRoot, viewRootAlias, viewType, embeddingViewPath, correlationResult, correlationBasisExpression, correlationKeyExpression, factory, attributePath, attribute.getFetches(), viewRootIndex, embeddingViewIndex, startIndex, correlationBasisType, correlationBasisEntity, createLimiter(mapperBuilder, correlationAlias, attribute), indexFetches, indexExpression, indexCorrelator, attribute.getContainerAccumulator(), dirtyTracking));
} else {
mapperBuilder.addTupleTransformerFactory(new CorrelatedSingularSubselectTupleTransformerFactory(new BasicCorrelator(), evm, viewRoot, viewRootAlias, viewType, embeddingViewPath, correlationResult, correlationBasisExpression, correlationKeyExpression, factory, attributePath, attribute.getFetches(), viewRootIndex, embeddingViewIndex, startIndex, correlationBasisType, correlationBasisEntity, createLimiter(mapperBuilder, correlationAlias, attribute)));
}
} else {
throw new UnsupportedOperationException("Unknown fetch strategy: " + attribute.getFetchStrategy());
}
}
use of com.blazebit.persistence.view.impl.objectbuilder.mapper.TupleElementMapper in project blaze-persistence by Blazebit.
the class ViewTypeObjectBuilder method applySelects.
@Override
public <X extends SelectBuilder<X>> void applySelects(X queryBuilder) {
if (fetches.isEmpty()) {
if (secondaryMappers.length != 0) {
FullQueryBuilder<?, ?> fullQueryBuilder = (FullQueryBuilder<?, ?>) queryBuilder;
for (SecondaryMapper viewRoot : secondaryMappers) {
viewRoot.apply(fullQueryBuilder, parameterHolder, optionalParameters, viewJpqlMacro, embeddingViewJpqlMacro);
}
}
for (int i = 0; i < mappers.length; i++) {
mappers[i].applyMapping(queryBuilder, parameterHolder, optionalParameters, viewJpqlMacro, embeddingViewJpqlMacro, false);
}
} else {
if (secondaryMappers.length != 0) {
FullQueryBuilder<?, ?> fullQueryBuilder = (FullQueryBuilder<?, ?>) queryBuilder;
for (SecondaryMapper viewRoot : secondaryMappers) {
if (fetches.contains(viewRoot.getAttributePath())) {
viewRoot.apply(fullQueryBuilder, parameterHolder, optionalParameters, viewJpqlMacro, embeddingViewJpqlMacro);
}
}
}
for (int i = 0; i < mappers.length; i++) {
TupleElementMapper mapper = mappers[i];
String attributePath = mapper.getAttributePath();
if (attributePath != null && fetches.contains(attributePath)) {
mapper.applyMapping(queryBuilder, parameterHolder, optionalParameters, viewJpqlMacro, embeddingViewJpqlMacro, false);
} else {
queryBuilder.select("NULL");
}
}
}
}
Aggregations