/* * 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 com.blazebit.persistence.OngoingFinalSetOperationCTECriteriaBuilder; import com.blazebit.persistence.MiddleOngoingSetOperationCTECriteriaBuilder; import com.blazebit.persistence.OngoingSetOperationCTECriteriaBuilder; import com.blazebit.persistence.StartOngoingSetOperationCTECriteriaBuilder; import com.blazebit.persistence.spi.SetOperationType; /** * * @param <T> The query result type * @author Christian Beikov * @since 1.1.0 */ public class StartOngoingSetOperationCTECriteriaBuilderImpl<T, Z extends AbstractCommonQueryBuilder<?, ?, ?, ?, ?>> extends AbstractCTECriteriaBuilder<T, StartOngoingSetOperationCTECriteriaBuilder<T, Z>, OngoingSetOperationCTECriteriaBuilder<T, Z>, StartOngoingSetOperationCTECriteriaBuilder<T, MiddleOngoingSetOperationCTECriteriaBuilder<T, Z>>> implements StartOngoingSetOperationCTECriteriaBuilder<T, Z> { protected final Z endSetResult; public StartOngoingSetOperationCTECriteriaBuilderImpl(MainQuery mainQuery, String cteName, Class<Object> clazz, T result, CTEBuilderListener listener, OngoingFinalSetOperationCTECriteriaBuilderImpl<Object> finalSetOperationBuilder, Z endSetResult) { super(mainQuery, cteName, clazz, result, listener, finalSetOperationBuilder); this.endSetResult = endSetResult; } @Override public StartOngoingSetOperationCTECriteriaBuilder<T, Z> from(Class<?> clazz) { return super.from(clazz); } @Override public StartOngoingSetOperationCTECriteriaBuilder<T, Z> from(Class<?> clazz, String alias) { return super.from(clazz, alias); } @Override public boolean isEmpty() { return super.isEmpty() && endSetResult.isEmpty(); } @Override public Z endSet() { subListener.verifyBuilderEnded(); this.setOperationEnded = true; // Only check the query if it's not empty if (!isEmpty()) { prepareAndCheck(); } listener.onBuilderEnded(this); if (isEmpty() && finalSetOperationBuilder.isEmpty()) { finalSetOperationBuilder.setOperationManager.replaceOperand(this, endSetResult); } finalSetOperationBuilder.setOperationEnded = true; return endSetResult; } @Override @SuppressWarnings({ "unchecked", "rawtypes" }) public OngoingFinalSetOperationCTECriteriaBuilder<Z> endSetWith() { subListener.verifyBuilderEnded(); this.setOperationEnded = true; // Only check the query if it's not empty if (!isEmpty()) { prepareAndCheck(); } listener.onBuilderEnded(this); return (OngoingFinalSetOperationCTECriteriaBuilder<Z>) (OngoingFinalSetOperationCTECriteriaBuilder) finalSetOperationBuilder; } @Override protected BaseFinalSetOperationCTECriteriaBuilderImpl<Object, ?> createFinalSetOperationBuilder(SetOperationType operator, boolean nested) { return createFinalSetOperationBuilder(operator, nested, true); } @Override protected OngoingSetOperationCTECriteriaBuilder<T, Z> createSetOperand(BaseFinalSetOperationCTECriteriaBuilderImpl<Object, ?> finalSetOperationBuilder) { subListener.verifyBuilderEnded(); listener.onBuilderEnded(this); return createOngoing(finalSetOperationBuilder, endSetResult); } @Override protected StartOngoingSetOperationCTECriteriaBuilder<T, MiddleOngoingSetOperationCTECriteriaBuilder<T, Z>> createSubquerySetOperand(BaseFinalSetOperationCTECriteriaBuilderImpl<Object, ?> finalSetOperationBuilder, BaseFinalSetOperationCTECriteriaBuilderImpl<Object, ?> resultFinalSetOperationBuilder) { subListener.verifyBuilderEnded(); listener.onBuilderEnded(this); StartOngoingSetOperationCTECriteriaBuilderImpl<T, Z> resultCb = createStartOngoing(resultFinalSetOperationBuilder, endSetResult); return (StartOngoingSetOperationCTECriteriaBuilder) createStartOngoing(finalSetOperationBuilder, resultCb); } }