
com.blazebit.persistence.impl.CTEManager Maven / Gradle / Ivy
/*
* Copyright 2015 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.LinkedHashSet;
import java.util.List;
import java.util.Set;
import com.blazebit.persistence.FullSelectCTECriteriaBuilder;
import com.blazebit.persistence.LeafOngoingSetOperationCTECriteriaBuilder;
import com.blazebit.persistence.ReturningModificationCriteriaBuilderFactory;
import com.blazebit.persistence.SelectRecursiveCTECriteriaBuilder;
import com.blazebit.persistence.StartOngoingSetOperationCTECriteriaBuilder;
/**
*
* @author Christian Beikov
* @author Moritz Becker
* @since 1.1.0
*/
public class CTEManager extends CTEBuilderListenerImpl {
private final MainQuery mainQuery;
private final Set ctes;
private boolean recursive = false;
CTEManager(MainQuery mainQuery) {
this.mainQuery = mainQuery;
this.ctes = new LinkedHashSet();
}
Set getCtes() {
return ctes;
}
public boolean hasCtes() {
return ctes.size() > 0;
}
boolean isRecursive() {
return recursive;
}
void buildClause(StringBuilder sb) {
if (ctes.isEmpty()) {
return;
}
sb.append("WITH ");
if (recursive) {
sb.append("RECURSIVE ");
}
boolean first = true;
for (CTEInfo cte : ctes) {
if (first) {
first = false;
} else {
sb.append(", ");
}
sb.append(cte.name);
sb.append('(');
final List attributes = cte.attributes;
sb.append(attributes.get(0));
for (int i = 1; i < attributes.size(); i++) {
sb.append(", ");
sb.append(attributes.get(i));
}
sb.append(')');
sb.append(" AS(\n");
sb.append(cte.nonRecursiveCriteriaBuilder.getQueryString());
if (cte.recursive) {
sb.append("\nUNION ALL\n");
sb.append(cte.recursiveCriteriaBuilder.getQueryString());
}
sb.append("\n)");
}
sb.append("\n");
}
@SuppressWarnings("unchecked")
StartOngoingSetOperationCTECriteriaBuilder> withStartSet(Class> cteClass, Y result) {
String cteName = cteClass.getSimpleName();
FinalSetOperationCTECriteriaBuilderImpl parentFinalSetOperationBuilder = new FinalSetOperationCTECriteriaBuilderImpl(mainQuery, (Class) cteClass, result, null, false, this, null);
OngoingFinalSetOperationCTECriteriaBuilderImpl subFinalSetOperationBuilder = new OngoingFinalSetOperationCTECriteriaBuilderImpl(mainQuery, (Class) cteClass, null, null, true, parentFinalSetOperationBuilder.getSubListener(), null);
this.onBuilderStarted(parentFinalSetOperationBuilder);
LeafOngoingSetOperationCTECriteriaBuilderImpl leafCb = new LeafOngoingSetOperationCTECriteriaBuilderImpl(mainQuery, cteName, (Class
© 2015 - 2025 Weber Informatics LLC | Privacy Policy