Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance. Project price only 1 $
You can buy this project and download/modify it how often you want.
/*
* Copyright 2014 - 2020 Blazebit.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.blazebit.persistence.impl;
import com.blazebit.persistence.BaseOngoingSetOperationBuilder;
import com.blazebit.persistence.parser.expression.Expression;
import com.blazebit.persistence.parser.expression.ExpressionCopyContext;
import com.blazebit.persistence.parser.expression.ExpressionFactory;
import com.blazebit.persistence.spi.DbmsStatementType;
import com.blazebit.persistence.spi.JpqlFunctionProcessor;
import com.blazebit.persistence.spi.SetOperationType;
import javax.persistence.Tuple;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
*
* @author Christian Beikov
* @author Moritz Becker
* @since 1.0.0
*/
public abstract class BaseSubqueryBuilderImpl, Z extends BaseOngoingSetOperationBuilder> extends AbstractCommonQueryBuilder> implements SubqueryInternalBuilder {
protected final T result;
protected final SubqueryBuilderListener listener;
protected final SubqueryBuilderListenerImpl subListener;
public BaseSubqueryBuilderImpl(MainQuery mainQuery, QueryContext queryContext, AliasManager aliasManager, JoinManager parentJoinManager, ExpressionFactory expressionFactory, T result, SubqueryBuilderListener listener, BaseFinalSetOperationSubqueryBuilderImpl finalSetOperationBuilder) {
super(mainQuery, queryContext, false, DbmsStatementType.SELECT, Tuple.class, null, aliasManager, parentJoinManager, expressionFactory, finalSetOperationBuilder, true);
this.result = result;
this.listener = listener;
this.subListener = new SubqueryBuilderListenerImpl();
}
public BaseSubqueryBuilderImpl(BaseSubqueryBuilderImpl builder, MainQuery mainQuery, QueryContext queryContext, Map joinManagerMapping, ExpressionCopyContext copyContext) {
super(builder, mainQuery, queryContext, joinManagerMapping, copyContext);
this.result = null;
this.listener = null;
this.subListener = null;
}
public SubqueryBuilderListenerImpl getSubListener() {
return subListener;
}
@Override
public Map> getJpqlFunctionProcessors() {
return selectManager.getJpqlFunctionProcessors();
}
@Override
public List getSelectExpressions() {
List selectExpressions = new ArrayList(selectManager.getSelectInfos().size());
for (SelectInfo info : selectManager.getSelectInfos()) {
selectExpressions.add(info.getExpression());
}
return selectExpressions;
}
@Override
public Set getCorrelatedExpressions(AliasManager aliasManager) {
prepareAndCheck();
CorrelatedExpressionGatheringVisitor visitor = new CorrelatedExpressionGatheringVisitor(aliasManager);
applyVisitor(visitor);
Set expressions = visitor.getExpressions();
joinManager.collectCorrelatedRootExpressions(aliasManager, expressions);
return expressions;
}
public T getResult() {
return result;
}
protected BaseFinalSetOperationSubqueryBuilderImpl createFinalSetOperationBuilder(SetOperationType operator, boolean nested, boolean isSubquery) {
SubqueryBuilderImpl newInitiator = finalSetOperationBuilder == null ? null : finalSetOperationBuilder.getInitiator();
return createFinalSetOperationBuilder(operator, nested, isSubquery, newInitiator);
}
protected BaseFinalSetOperationSubqueryBuilderImpl createFinalSetOperationBuilder(SetOperationType operator, boolean nested, boolean isSubquery, SubqueryBuilderImpl newInitiator) {
// TODO: this should never be null, handle it!
SubqueryBuilderListener newListener = finalSetOperationBuilder == null ? listener : finalSetOperationBuilder.getSubListener();
T newResult = finalSetOperationBuilder == null ? result : finalSetOperationBuilder.getResult();
if (isSubquery) {
return new OngoingFinalSetOperationSubqueryBuilderImpl(mainQuery, queryContext, newResult, operator, nested, newListener, newInitiator);
} else {
return new FinalSetOperationSubqueryBuilderImpl(mainQuery, queryContext, newResult, operator, nested, newListener, newInitiator);
}
}
@SuppressWarnings("unchecked")
protected LeafOngoingSetOperationSubqueryBuilderImpl createLeaf(BaseFinalSetOperationSubqueryBuilderImpl finalSetOperationBuilder) {
SubqueryBuilderListener newListener = finalSetOperationBuilder.getSubListener();
LeafOngoingSetOperationSubqueryBuilderImpl next = new LeafOngoingSetOperationSubqueryBuilderImpl(mainQuery, queryContext, aliasManager.getParent(), joinManager.getParent(), expressionFactory, result, newListener, (FinalSetOperationSubqueryBuilderImpl) finalSetOperationBuilder);
newListener.onBuilderStarted(next);
return next;
}
@SuppressWarnings("unchecked")
protected StartOngoingSetOperationSubqueryBuilderImpl createStartOngoing(BaseFinalSetOperationSubqueryBuilderImpl finalSetOperationBuilder, W endSetResult) {
// TODO: This is such an ugly hack, but I don't know how else to fix this generics issue for now
finalSetOperationBuilder.setEndSetResult((T) endSetResult);
SubqueryBuilderListener newListener = finalSetOperationBuilder.getSubListener();
StartOngoingSetOperationSubqueryBuilderImpl next = new StartOngoingSetOperationSubqueryBuilderImpl(mainQuery, queryContext, aliasManager.getParent(), joinManager.getParent(), expressionFactory, result, newListener, (OngoingFinalSetOperationSubqueryBuilderImpl) finalSetOperationBuilder, endSetResult);
newListener.onBuilderStarted(next);
return next;
}
@SuppressWarnings("unchecked")
protected OngoingSetOperationSubqueryBuilderImpl createOngoing(BaseFinalSetOperationSubqueryBuilderImpl finalSetOperationBuilder, W endSetResult) {
// TODO: This is such an ugly hack, but I don't know how else to fix this generics issue for now
finalSetOperationBuilder.setEndSetResult((T) endSetResult);
SubqueryBuilderListener newListener = finalSetOperationBuilder.getSubListener();
OngoingSetOperationSubqueryBuilderImpl next = new OngoingSetOperationSubqueryBuilderImpl(mainQuery, queryContext, aliasManager.getParent(), joinManager.getParent(), expressionFactory, result, newListener, (OngoingFinalSetOperationSubqueryBuilderImpl) finalSetOperationBuilder, endSetResult);
newListener.onBuilderStarted(next);
return next;
}
}