package com.tesora.dve.sql.transform.strategy.featureplan;
/*
* #%L
* Tesora Inc.
* Database Virtualization Engine
* %%
* Copyright (C) 2011 - 2014 Tesora Inc.
* %%
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License, version 3,
* as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
* #L%
*/
import com.tesora.dve.exceptions.PEException;
import com.tesora.dve.sql.schema.DistributionKey;
import com.tesora.dve.sql.schema.PEStorageGroup;
import com.tesora.dve.sql.statement.session.TransactionStatement;
import com.tesora.dve.sql.transform.execution.ExecutionSequence;
import com.tesora.dve.sql.transform.execution.ExecutionStep;
import com.tesora.dve.sql.transform.execution.InsertExecutionStep;
import com.tesora.dve.sql.transform.execution.TransactionExecutionStep;
import com.tesora.dve.sql.transform.strategy.PlannerContext;
public abstract class InsertFeatureStep extends FeatureStep {
protected final boolean requiresReferenceTimestamp;
protected final Boolean cacheable;
protected final TransactionStatement.Kind txnal;
public InsertFeatureStep(FeaturePlanner planner, PEStorageGroup srcGroup,
DistributionKey key, boolean reqTimestamp, Boolean isCacheable, TransactionStatement.Kind txnal) {
super(planner, srcGroup, key);
requiresReferenceTimestamp = reqTimestamp;
this.cacheable = isCacheable;
this.txnal = txnal;
withDefangInvariants();
}
@Override
protected final void scheduleSelf(PlannerContext sc, ExecutionSequence es)
throws PEException {
ExecutionStep step = buildStep(sc,es);
if (step instanceof InsertExecutionStep) {
InsertExecutionStep ies = (InsertExecutionStep) step;
ies.setRequiresReferenceTimestamp(requiresReferenceTimestamp);
}
if (es.getPlan() != null) {
if (Boolean.FALSE.equals(cacheable))
es.getPlan().setCacheable(false);
else
es.getPlan().setCacheable(true);
}
if (txnal == TransactionStatement.Kind.START)
es.append(TransactionExecutionStep.buildStart(sc.getContext(), getDatabase(sc)));
es.append(step);
if (txnal == TransactionStatement.Kind.COMMIT)
es.append(TransactionExecutionStep.buildCommit(sc.getContext(), getDatabase(sc)));
}
protected abstract ExecutionStep buildStep(PlannerContext sc, ExecutionSequence es) throws PEException;
}