Search in sources :

Example 1 with JoinCorrelationBuilder

use of com.blazebit.persistence.view.impl.objectbuilder.transformer.correlation.JoinCorrelationBuilder in project blaze-persistence by Blazebit.

the class ExpressionCorrelationJoinTupleElementMapper method applyMapping.

@Override
public void applyMapping(SelectBuilder<?> queryBuilder, ParameterHolder<?> parameterHolder, Map<String, Object> optionalParameters, ViewJpqlMacro viewJpqlMacro, EmbeddingViewJpqlMacro embeddingViewJpqlMacro, boolean asString) {
    String oldViewPath = viewJpqlMacro.getViewPath();
    String oldEmbeddingViewPath = embeddingViewJpqlMacro.getEmbeddingViewPath();
    viewJpqlMacro.setViewPath(embeddingViewPath);
    embeddingViewJpqlMacro.setEmbeddingViewPath(embeddingViewPath);
    FullQueryBuilder<?, ?> fullQueryBuilder;
    if (queryBuilder instanceof ConstrainedSelectBuilder) {
        fullQueryBuilder = ((ConstrainedSelectBuilder) queryBuilder).getQueryBuilder();
    } else {
        fullQueryBuilder = (FullQueryBuilder<?, ?>) queryBuilder;
    }
    int originalFirstResult = -1;
    int originalMaxResults = -1;
    if (queryBuilder instanceof LimitBuilder<?>) {
        originalFirstResult = ((LimitBuilder<?>) queryBuilder).getFirstResult();
        originalMaxResults = ((LimitBuilder<?>) queryBuilder).getMaxResults();
    }
    JoinCorrelationBuilder correlationBuilder = new JoinCorrelationBuilder(parameterHolder, optionalParameters, fullQueryBuilder, joinBase, correlationAlias, correlationExternalAlias, attributePath, JoinType.LEFT, limiter);
    provider.applyCorrelation(correlationBuilder, correlationBasis);
    if (queryBuilder instanceof LimitBuilder<?>) {
        if (originalFirstResult != ((LimitBuilder<?>) queryBuilder).getFirstResult() || originalMaxResults != ((LimitBuilder<?>) queryBuilder).getMaxResults()) {
            throw new IllegalArgumentException("Correlation provider '" + provider + "' wrongly uses setFirstResult() or setMaxResults() on the query builder which might lead to wrong results. Use SELECT fetching with batch size 1 or reformulate the correlation provider to use the limit/offset in a subquery!");
        }
    }
    correlationBuilder.finish();
    // Basic element has an alias, subviews don't
    if (alias != null) {
        viewJpqlMacro.setViewPath(null);
        queryBuilder.select(correlationResult, alias);
    }
    viewJpqlMacro.setViewPath(oldViewPath);
    embeddingViewJpqlMacro.setEmbeddingViewPath(oldEmbeddingViewPath);
    if (fetches.length != 0) {
        for (int i = 0; i < fetches.length; i++) {
            fullQueryBuilder.fetch(correlationBuilder.getCorrelationAlias() + "." + fetches[i]);
        }
    }
}
Also used : JoinCorrelationBuilder(com.blazebit.persistence.view.impl.objectbuilder.transformer.correlation.JoinCorrelationBuilder) LimitBuilder(com.blazebit.persistence.LimitBuilder)

Example 2 with JoinCorrelationBuilder

use of com.blazebit.persistence.view.impl.objectbuilder.transformer.correlation.JoinCorrelationBuilder in project blaze-persistence by Blazebit.

the class EntityViewRootSecondaryMapper method apply.

@Override
public void apply(FullQueryBuilder<?, ?> fullQueryBuilder, ParameterHolder<?> parameterHolder, Map<String, Object> optionalParameters, ViewJpqlMacro viewJpqlMacro, EmbeddingViewJpqlMacro embeddingViewJpqlMacro) {
    String oldViewPath = viewJpqlMacro.getViewPath();
    String oldEmbeddingViewPath = embeddingViewJpqlMacro.getEmbeddingViewPath();
    viewJpqlMacro.setViewPath(viewPath);
    embeddingViewJpqlMacro.setEmbeddingViewPath(embeddingViewPath);
    CorrelationProvider correlationProvider = correlationProviderFactory.create(parameterHolder, optionalParameters);
    String correlationAlias;
    if (limiter == null) {
        correlationAlias = entityViewRootName;
    } else {
        correlationAlias = "_sub_" + entityViewRootName;
    }
    JoinCorrelationBuilder correlationBuilder = new JoinCorrelationBuilder(parameterHolder, optionalParameters, fullQueryBuilder, viewJpqlMacro.getViewPath(), correlationAlias, entityViewRootName, attributePath, joinType, limiter);
    correlationProvider.applyCorrelation(correlationBuilder, viewJpqlMacro.getViewPath());
    correlationBuilder.finish();
    fullQueryBuilder.fetch(fetches);
    embeddingViewJpqlMacro.setEmbeddingViewPath(oldEmbeddingViewPath);
    viewJpqlMacro.setViewPath(oldViewPath);
}
Also used : JoinCorrelationBuilder(com.blazebit.persistence.view.impl.objectbuilder.transformer.correlation.JoinCorrelationBuilder) CorrelationProvider(com.blazebit.persistence.view.CorrelationProvider)

Example 3 with JoinCorrelationBuilder

use of com.blazebit.persistence.view.impl.objectbuilder.transformer.correlation.JoinCorrelationBuilder in project blaze-persistence by Blazebit.

the class ParameterizedExpressionCorrelationJoinTupleElementMapper method applyMapping.

@Override
public void applyMapping(SelectBuilder<?> queryBuilder, ParameterHolder<?> parameterHolder, Map<String, Object> optionalParameters, ViewJpqlMacro viewJpqlMacro, EmbeddingViewJpqlMacro embeddingViewJpqlMacro, boolean asString) {
    String oldViewPath = viewJpqlMacro.getViewPath();
    String oldEmbeddingViewPath = embeddingViewJpqlMacro.getEmbeddingViewPath();
    viewJpqlMacro.setViewPath(embeddingViewPath);
    embeddingViewJpqlMacro.setEmbeddingViewPath(embeddingViewPath);
    FullQueryBuilder<?, ?> fullQueryBuilder;
    if (queryBuilder instanceof ConstrainedSelectBuilder) {
        fullQueryBuilder = ((ConstrainedSelectBuilder) queryBuilder).getQueryBuilder();
    } else {
        fullQueryBuilder = (FullQueryBuilder<?, ?>) queryBuilder;
    }
    int originalFirstResult = -1;
    int originalMaxResults = -1;
    if (queryBuilder instanceof LimitBuilder<?>) {
        originalFirstResult = ((LimitBuilder<?>) queryBuilder).getFirstResult();
        originalMaxResults = ((LimitBuilder<?>) queryBuilder).getMaxResults();
    }
    JoinCorrelationBuilder correlationBuilder = new JoinCorrelationBuilder(parameterHolder, optionalParameters, fullQueryBuilder, joinBase, correlationAlias, correlationExternalAlias, attributePath, JoinType.LEFT, limiter);
    CorrelationProvider provider = providerFactory.create(parameterHolder, optionalParameters);
    provider.applyCorrelation(correlationBuilder, correlationBasis);
    if (queryBuilder instanceof LimitBuilder<?>) {
        if (originalFirstResult != ((LimitBuilder<?>) queryBuilder).getFirstResult() || originalMaxResults != ((LimitBuilder<?>) queryBuilder).getMaxResults()) {
            throw new IllegalArgumentException("Correlation provider '" + provider + "' wrongly uses setFirstResult() or setMaxResults() on the query builder which might lead to wrong results. Use SELECT fetching with batch size 1 or reformulate the correlation provider to use the limit/offset in a subquery!");
        }
    }
    correlationBuilder.finish();
    // Basic element has an alias, subviews don't
    if (alias != null) {
        viewJpqlMacro.setViewPath(null);
        queryBuilder.select(correlationResult, alias);
    }
    viewJpqlMacro.setViewPath(oldViewPath);
    embeddingViewJpqlMacro.setEmbeddingViewPath(oldEmbeddingViewPath);
    if (fetches.length != 0) {
        for (int i = 0; i < fetches.length; i++) {
            fullQueryBuilder.fetch(correlationBuilder.getCorrelationAlias() + "." + fetches[i]);
        }
    }
}
Also used : JoinCorrelationBuilder(com.blazebit.persistence.view.impl.objectbuilder.transformer.correlation.JoinCorrelationBuilder) LimitBuilder(com.blazebit.persistence.LimitBuilder) CorrelationProvider(com.blazebit.persistence.view.CorrelationProvider)

Example 4 with JoinCorrelationBuilder

use of com.blazebit.persistence.view.impl.objectbuilder.transformer.correlation.JoinCorrelationBuilder in project blaze-persistence by Blazebit.

the class ManagedViewTypeImpl method renderSecondaryMappings.

@Override
public void renderSecondaryMappings(String viewPath, BaseQueryBuilder<?, ?> baseQueryBuilder, Map<String, Object> optionalParameters, boolean renderFetches) {
    if (baseQueryBuilder instanceof CTEBuilder) {
        CTEBuilder<?> cteBuilder = (CTEBuilder<?>) baseQueryBuilder;
        for (CTEProvider cteProvider : getCteProviders()) {
            cteProvider.applyCtes(cteBuilder, optionalParameters);
        }
    }
    for (ViewRoot viewRoot : viewRoots) {
        String entityViewRootName = viewRoot.getName();
        CorrelationProvider correlationProvider = viewRoot.getCorrelationProviderFactory().create(baseQueryBuilder, optionalParameters);
        ExpressionFactory expressionFactory = baseQueryBuilder.getService(ExpressionFactory.class);
        Limiter limiter = createLimiter(expressionFactory, viewPath, viewRoot.getLimitExpression(), viewRoot.getOffsetExpression(), viewRoot.getOrderByItems());
        String correlationAlias;
        if (limiter == null) {
            correlationAlias = entityViewRootName;
        } else {
            correlationAlias = "_sub_" + entityViewRootName;
        }
        JoinCorrelationBuilder correlationBuilder = new JoinCorrelationBuilder(baseQueryBuilder, optionalParameters, baseQueryBuilder, viewPath, correlationAlias, entityViewRootName, null, viewRoot.getJoinType(), limiter);
        correlationProvider.applyCorrelation(correlationBuilder, viewPath);
        correlationBuilder.finish();
        if (renderFetches && baseQueryBuilder instanceof FetchBuilder<?>) {
            ((FetchBuilder<?>) baseQueryBuilder).fetch(viewRoot.getFetches());
        }
    }
}
Also used : CTEProvider(com.blazebit.persistence.view.CTEProvider) JoinCorrelationBuilder(com.blazebit.persistence.view.impl.objectbuilder.transformer.correlation.JoinCorrelationBuilder) FetchBuilder(com.blazebit.persistence.FetchBuilder) ExpressionFactory(com.blazebit.persistence.parser.expression.ExpressionFactory) ViewRoot(com.blazebit.persistence.view.metamodel.ViewRoot) StaticCorrelationProvider(com.blazebit.persistence.view.impl.StaticCorrelationProvider) CorrelationProvider(com.blazebit.persistence.view.CorrelationProvider) StaticPathCorrelationProvider(com.blazebit.persistence.view.impl.StaticPathCorrelationProvider) CTEBuilder(com.blazebit.persistence.CTEBuilder) Limiter(com.blazebit.persistence.view.impl.objectbuilder.Limiter)

Aggregations

JoinCorrelationBuilder (com.blazebit.persistence.view.impl.objectbuilder.transformer.correlation.JoinCorrelationBuilder)4 CorrelationProvider (com.blazebit.persistence.view.CorrelationProvider)3 LimitBuilder (com.blazebit.persistence.LimitBuilder)2 CTEBuilder (com.blazebit.persistence.CTEBuilder)1 FetchBuilder (com.blazebit.persistence.FetchBuilder)1 ExpressionFactory (com.blazebit.persistence.parser.expression.ExpressionFactory)1 CTEProvider (com.blazebit.persistence.view.CTEProvider)1 StaticCorrelationProvider (com.blazebit.persistence.view.impl.StaticCorrelationProvider)1 StaticPathCorrelationProvider (com.blazebit.persistence.view.impl.StaticPathCorrelationProvider)1 Limiter (com.blazebit.persistence.view.impl.objectbuilder.Limiter)1 ViewRoot (com.blazebit.persistence.view.metamodel.ViewRoot)1