blob: 823113f8570e085983132d8afebe44bc184133e5 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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 org.apache.cassandra.distributed.impl;
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.List;
import org.apache.cassandra.cql3.CQLStatement;
import org.apache.cassandra.cql3.QueryOptions;
import org.apache.cassandra.cql3.QueryProcessor;
import org.apache.cassandra.db.ConsistencyLevel;
import org.apache.cassandra.distributed.api.IIsolatedExecutor;
import org.apache.cassandra.service.ClientState;
import org.apache.cassandra.service.ClientWarn;
import org.apache.cassandra.service.QueryState;
import org.apache.cassandra.transport.ProtocolVersion;
import org.apache.cassandra.transport.messages.ResultMessage;
import org.apache.cassandra.utils.ByteBufferUtil;
import org.apache.cassandra.utils.FBUtilities;
import static org.apache.cassandra.utils.Clock.Global.nanoTime;
public class Query implements IIsolatedExecutor.SerializableCallable<Object[][]>
{
private static final long serialVersionUID = 1L;
final String query;
final long timestamp;
final org.apache.cassandra.distributed.api.ConsistencyLevel commitConsistencyOrigin;
final org.apache.cassandra.distributed.api.ConsistencyLevel serialConsistencyOrigin;
final Object[] boundValues;
public Query(String query, long timestamp, org.apache.cassandra.distributed.api.ConsistencyLevel commitConsistencyOrigin, org.apache.cassandra.distributed.api.ConsistencyLevel serialConsistencyOrigin, Object[] boundValues)
{
this.query = query;
this.timestamp = timestamp;
this.commitConsistencyOrigin = commitConsistencyOrigin;
this.serialConsistencyOrigin = serialConsistencyOrigin;
this.boundValues = boundValues;
}
public Object[][] call()
{
ConsistencyLevel commitConsistency = toCassandraCL(commitConsistencyOrigin);
ConsistencyLevel serialConsistency = serialConsistencyOrigin == null ? null : toCassandraCL(serialConsistencyOrigin);
ClientState clientState = Coordinator.makeFakeClientState();
CQLStatement prepared = QueryProcessor.getStatement(query, clientState);
List<ByteBuffer> boundBBValues = new ArrayList<>();
for (Object boundValue : boundValues)
boundBBValues.add(ByteBufferUtil.objectToBytes(boundValue));
prepared.validate(QueryState.forInternalCalls().getClientState());
// Start capturing warnings on this thread. Note that this will implicitly clear out any previous
// warnings as it sets a new State instance on the ThreadLocal.
ClientWarn.instance.captureWarnings();
ResultMessage res = prepared.execute(QueryState.forInternalCalls(),
QueryOptions.create(commitConsistency,
boundBBValues,
false,
Integer.MAX_VALUE,
null,
serialConsistency,
ProtocolVersion.V4,
null,
timestamp,
FBUtilities.nowInSeconds()),
nanoTime());
// Collect warnings reported during the query.
if (res != null)
res.setWarnings(ClientWarn.instance.getWarnings());
return RowUtil.toQueryResult(res).toObjectArrays();
}
public String toString()
{
return String.format(query.replaceAll("\\?", "%s") + " AT " + commitConsistencyOrigin, boundValues);
}
static org.apache.cassandra.db.ConsistencyLevel toCassandraCL(org.apache.cassandra.distributed.api.ConsistencyLevel cl)
{
return org.apache.cassandra.db.ConsistencyLevel.fromCode(cl.ordinal());
}
static final org.apache.cassandra.distributed.api.ConsistencyLevel[] API_CLs = org.apache.cassandra.distributed.api.ConsistencyLevel.values();
static org.apache.cassandra.distributed.api.ConsistencyLevel fromCassandraCL(org.apache.cassandra.db.ConsistencyLevel cl)
{
return API_CLs[cl.ordinal()];
}
}