/*
* JBoss, Home of Professional Open Source.
* See the COPYRIGHT.txt file distributed with this work for information
* regarding copyright ownership. Some portions may be licensed
* to Red Hat, Inc. under one or more contributor license agreements.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301 USA.
*/
/*
*/
package org.teiid.dqp.message;
import java.util.concurrent.atomic.AtomicInteger;
import org.teiid.client.RequestMessage;
import org.teiid.common.buffer.BufferManager;
import org.teiid.dqp.internal.process.DQPWorkContext;
import org.teiid.dqp.service.TransactionContext;
import org.teiid.dqp.service.TransactionContext.Scope;
import org.teiid.query.sql.lang.Command;
import org.teiid.query.util.CommandContext;
/**
* This class defines a request message for the Connector layer. This is uniquely identified
* by AtomicRequestID.
*/
public class AtomicRequestMessage {
static final long serialVersionUID = -4060941593023225562L;
/**
* static counter to keep track of the Execution count.
*/
private static AtomicInteger EXECUTION_COUNT = new AtomicInteger(0);
// atomic request id (request-id + node-id + execution-count)
private AtomicRequestID atomicRequestId;
/**
* The connectorBindingID that identifies the connector needed for this
* query.
*/
private String connectorName;
/**
* Name of model where the connector is bound to
*/
private String modelName;
// Transaction context for the current request
private TransactionContext txnContext;
// command to execute
private Command command;
// results fetch size
private int fetchSize = BufferManager.DEFAULT_PROCESSOR_BATCH_SIZE;
// The time when command begins processing on the server.
private long processingTimestamp = System.currentTimeMillis();
private boolean partialResultsFlag;
private RequestID requestID;
private boolean exceptionOnMaxRows;
private int maxRows;
private boolean serial;
private DQPWorkContext workContext;
private CommandContext commandContext;
private BufferManager bufferManager;
public AtomicRequestMessage(RequestMessage requestMessage, DQPWorkContext parent, int nodeId){
this.workContext = parent;
this.requestID = new RequestID(parent.getSessionId(), requestMessage.getExecutionId());
this.atomicRequestId = new AtomicRequestID(this.requestID, nodeId, EXECUTION_COUNT.getAndIncrement());
}
public int getMaxResultRows() {
return maxRows;
}
public void setMaxResultRows(int maxRows) {
this.maxRows = maxRows;
}
public boolean isExceptionOnMaxRows() {
return exceptionOnMaxRows;
}
public void setExceptionOnMaxRows(boolean exceptionOnMaxRows) {
this.exceptionOnMaxRows = exceptionOnMaxRows;
}
public AtomicRequestID getAtomicRequestID() {
return this.atomicRequestId;
}
public String getConnectorName() {
return connectorName;
}
public void setConnectorName(String string) {
connectorName = string;
}
public String getModelName() {
return this.modelName;
}
public void setModelName(String modelName) {
this.modelName = modelName;
}
public TransactionContext getTransactionContext() {
return txnContext;
}
public void setTransactionContext(TransactionContext context) {
txnContext = context;
}
public boolean isSerial() {
return serial;
}
public void setSerial(boolean serial) {
this.serial = serial;
}
public boolean isTransactional(){
return this.txnContext != null && this.txnContext.getTransactionType() != Scope.NONE;
}
public Command getCommand() {
return command;
}
public void setCommand(Command command) {
this.command = command;
}
public int getFetchSize() {
return fetchSize;
}
public void setFetchSize(int fetchSize) {
if (fetchSize < 1) {
throw new IllegalArgumentException("fetch size must be positive"); //$NON-NLS-1$
}
this.fetchSize = fetchSize;
}
/**
* Get time that the request was assigned a unique ID by the server.
* @return timestamp in millis
*/
public long getProcessingTimestamp() {
return processingTimestamp;
}
public boolean supportsPartialResults() {
return partialResultsFlag;
}
public void setPartialResults(boolean partial) {
partialResultsFlag = partial;
}
public String toString() {
return atomicRequestId.toString();
}
public void setRequestID(RequestID requestID) {
this.requestID = requestID;
}
public RequestID getRequestID() {
return requestID;
}
public void setWorkContext(DQPWorkContext workContext) {
this.workContext = workContext;
}
public DQPWorkContext getWorkContext() {
return workContext;
}
public CommandContext getCommandContext() {
return commandContext;
}
public void setCommandContext(CommandContext commandContext) {
this.commandContext = commandContext;
}
public BufferManager getBufferManager() {
return bufferManager;
}
public void setBufferManager(BufferManager bufferManager) {
this.bufferManager = bufferManager;
}
}