All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.blazebit.persistence.impl.CTEManager Maven / Gradle / Ivy

There is a newer version: 1.2.0-Alpha1
Show newest version
/*
 * 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) cteClass, result, parentFinalSetOperationBuilder.getSubListener(), (FinalSetOperationCTECriteriaBuilderImpl) parentFinalSetOperationBuilder);
        OngoingSetOperationCTECriteriaBuilderImpl> cb = new OngoingSetOperationCTECriteriaBuilderImpl>(mainQuery, cteName, (Class) cteClass, result, subFinalSetOperationBuilder.getSubListener(), (OngoingFinalSetOperationCTECriteriaBuilderImpl) subFinalSetOperationBuilder, leafCb);
        
        subFinalSetOperationBuilder.setOperationManager.setStartQueryBuilder(cb);
        parentFinalSetOperationBuilder.setOperationManager.setStartQueryBuilder(subFinalSetOperationBuilder);

        subFinalSetOperationBuilder.getSubListener().onBuilderStarted(cb);
        parentFinalSetOperationBuilder.getSubListener().onBuilderStarted(leafCb);
        
        return cb;
    }

    @SuppressWarnings("unchecked")
	 FullSelectCTECriteriaBuilder with(Class cteClass, Y result) {
        String cteName = cteClass.getSimpleName();
		FullSelectCTECriteriaBuilderImpl cteBuilder = new FullSelectCTECriteriaBuilderImpl(mainQuery, cteName, (Class) cteClass, result, this);
        this.onBuilderStarted(cteBuilder);
		return cteBuilder;
	}

	@SuppressWarnings("unchecked")
     SelectRecursiveCTECriteriaBuilder withRecursive(Class cteClass, Y result) {
        String cteName = cteClass.getSimpleName();
		recursive = true;
		RecursiveCTECriteriaBuilderImpl cteBuilder = new RecursiveCTECriteriaBuilderImpl(mainQuery, cteName, (Class) cteClass, result, this);
        this.onBuilderStarted(cteBuilder);
		return cteBuilder;
	}

	 ReturningModificationCriteriaBuilderFactory withReturning(Class cteClass, Y result) {
	    String cteName = cteClass.getSimpleName();
	    ReturningModificationCriteraBuilderFactoryImpl factory = new ReturningModificationCriteraBuilderFactoryImpl(mainQuery, cteName, cteClass, result, this);
		return factory;
	}

    @Override
	public void onBuilderEnded(CTEInfoBuilder builder) {
		super.onBuilderEnded(builder);
		CTEInfo cteInfo = builder.createCTEInfo();
		ctes.add(cteInfo);
	}

}