/*
* Copyright 2014 - 2017 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 java.util.List;
import com.blazebit.persistence.BaseFinalSetOperationBuilder;
import com.blazebit.persistence.BaseOngoingFinalSetOperationBuilder;
import com.blazebit.persistence.spi.SetOperationType;
/**
*
* @param <T> The query result type
* @author Christian Beikov
* @since 1.1.0
*/
public class BaseFinalSetOperationCTECriteriaBuilderImpl<T, X extends BaseFinalSetOperationBuilder<T, X>> extends BaseFinalSetOperationBuilderImpl<T, X, BaseFinalSetOperationCTECriteriaBuilderImpl<T, X>> implements BaseOngoingFinalSetOperationBuilder<T, X>, CTEInfoBuilder {
protected final T result;
protected final CTEBuilderListener listener;
protected final FullSelectCTECriteriaBuilderImpl<?> initiator;
protected final CTEBuilderListenerImpl subListener;
public BaseFinalSetOperationCTECriteriaBuilderImpl(MainQuery mainQuery, Class<T> clazz, T result, SetOperationType operator, boolean nested, CTEBuilderListener listener, FullSelectCTECriteriaBuilderImpl<?> initiator) {
super(mainQuery, false, clazz, operator, nested, result);
this.result = result;
this.listener = listener;
this.initiator = initiator;
this.subListener = new CTEBuilderListenerImpl();
}
public FullSelectCTECriteriaBuilderImpl<?> getInitiator() {
return initiator;
}
public T getResult() {
return result;
}
public CTEBuilderListener getListener() {
return listener;
}
public CTEBuilderListenerImpl getSubListener() {
return subListener;
}
@Override
public CTEInfo createCTEInfo() {
return createCTEInfo(this, this);
}
private static CTEInfo createCTEInfo(AbstractCommonQueryBuilder<?, ?, ?, ?, ?> queryBuilder, AbstractCommonQueryBuilder<?, ?, ?, ?, ?> target) {
if (queryBuilder instanceof BaseFinalSetOperationCTECriteriaBuilderImpl<?, ?>) {
BaseFinalSetOperationCTECriteriaBuilderImpl<?, ?> setOperationBuilder = (BaseFinalSetOperationCTECriteriaBuilderImpl<?, ?>) queryBuilder;
if (setOperationBuilder.initiator == null) {
return createCTEInfo(setOperationBuilder.setOperationManager.getStartQueryBuilder(), target);
} else {
List<String> attributes = setOperationBuilder.initiator.prepareAndGetAttributes();
List<String> columns = setOperationBuilder.initiator.prepareAndGetColumnNames();
CTEInfo info = new CTEInfo(setOperationBuilder.initiator.cteName, setOperationBuilder.initiator.cteType, attributes, columns, false, false, target, null);
return info;
}
} else if (queryBuilder instanceof AbstractCTECriteriaBuilder<?, ?, ?, ?>) {
AbstractCTECriteriaBuilder<?, ?, ?, ?> cteBuilder = (AbstractCTECriteriaBuilder<?, ?, ?, ?>) queryBuilder;
List<String> attributes = cteBuilder.prepareAndGetAttributes();
List<String> columns = cteBuilder.prepareAndGetColumnNames();
CTEInfo info = new CTEInfo(cteBuilder.cteName, cteBuilder.cteType, attributes, columns, false, false, target, null);
return info;
}
throw new IllegalArgumentException("Unsupported query builder type for creating a CTE info: " + queryBuilder);
}
}