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

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

The newest version!
package com.blazebit.persistence.impl;

import java.util.List;

import com.blazebit.persistence.SelectCTECriteriaBuilder;
import com.blazebit.persistence.SelectRecursiveCTECriteriaBuilder;

public class RecursiveCTECriteriaBuilderImpl extends AbstractCTECriteriaBuilder, SelectCTECriteriaBuilder, Void> implements SelectRecursiveCTECriteriaBuilder, CTEBuilderListener {

    protected final Class clazz;
	protected boolean done;
	protected boolean unionAll;
	protected SelectCTECriteriaBuilderImpl recursiveCteBuilder;

	public RecursiveCTECriteriaBuilderImpl(MainQuery mainQuery, String cteName, Class clazz, Y result, final CTEBuilderListener listener) {
		super(mainQuery, cteName, clazz, result, listener, null);
		this.clazz = clazz;
	}

    @Override
    public SelectCTECriteriaBuilderImpl union() {
        verifyBuilderEnded();
        unionAll = false;
        recursiveCteBuilder = new SelectCTECriteriaBuilderImpl(mainQuery, cteName, clazz, result, this);
        return recursiveCteBuilder;
    }

	@Override
	public SelectCTECriteriaBuilderImpl unionAll() {
		verifyBuilderEnded();
		unionAll = true;
		recursiveCteBuilder = new SelectCTECriteriaBuilderImpl(mainQuery, cteName, clazz, result, this);
		return recursiveCteBuilder;
	}

	@Override
    public void onReplaceBuilder(CTEInfoBuilder oldBuilder, CTEInfoBuilder newBuilder) {
        // Don't care about that
    }

    @Override
	public void onBuilderStarted(CTEInfoBuilder builder) {
		// Don't care about that
	}

	@Override
	public void onBuilderEnded(CTEInfoBuilder builder) {
		done = true;
		listener.onBuilderEnded(this);
	}
	
    public void verifyBuilderEnded() {
        if (recursiveCteBuilder != null && !done) {
            throw new BuilderChainingException("A builder was not ended properly.");
        }
    }

	@Override
	public CTEInfo createCTEInfo() {
		verifyBuilderEnded();
        List attributes = prepareAndGetAttributes();
		
		// As a side effect, this will reorder selects according to attribute order
		recursiveCteBuilder.createCTEInfo();
		CTEInfo info = new CTEInfo(cteName, cteType, attributes, true, unionAll, this, recursiveCteBuilder);
		return info;
	}

}