/* * Licensed to Elasticsearch under one or more contributor * license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright * ownership. Elasticsearch 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.elasticsearch.action.percolate; import java.io.IOException; import java.util.ArrayList; import java.util.Collection; import org.apache.cassandra.dht.Range; import org.apache.cassandra.dht.Token; import org.elasticsearch.action.OriginalIndices; import org.elasticsearch.action.support.broadcast.BroadcastShardRequest; import org.elasticsearch.cluster.routing.ShardRouting; import org.elasticsearch.common.bytes.BytesReference; import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.io.stream.StreamOutput; import org.elasticsearch.index.shard.ShardId; /** */ public class PercolateShardRequest extends BroadcastShardRequest { private String documentType; private BytesReference source; private BytesReference docSource; private boolean onlyCount; private int numberOfShards; private long startTime; private Collection<Range<Token>> tokenRanges; public PercolateShardRequest() { } PercolateShardRequest(ShardRouting shard, int numberOfShards, PercolateRequest request) { super(new ShardId(shard.index(), shard.id()), request); this.documentType = request.documentType(); this.source = request.source(); this.docSource = request.docSource(); this.onlyCount = request.onlyCount(); this.numberOfShards = numberOfShards; this.startTime = request.startTime; // Use the user provided token_range of the shardRouting one. this.tokenRanges = (request.tokenRanges() != null) ? request.tokenRanges() : shard.tokenRanges(); } PercolateShardRequest(ShardId shardId, OriginalIndices originalIndices) { super(shardId, originalIndices); } PercolateShardRequest(ShardId shardId, PercolateRequest request) { super(shardId, request); this.documentType = request.documentType(); this.source = request.source(); this.docSource = request.docSource(); this.onlyCount = request.onlyCount(); this.startTime = request.startTime; this.tokenRanges = request.tokenRanges(); } public Collection<Range<Token>> tokenRanges() { return tokenRanges; } public PercolateShardRequest tokenRanges(Collection<Range<Token>> tokenRanges) { this.tokenRanges = tokenRanges; return this; } public String documentType() { return documentType; } public BytesReference source() { return source; } public BytesReference docSource() { return docSource; } public boolean onlyCount() { return onlyCount; } void documentType(String documentType) { this.documentType = documentType; } void source(BytesReference source) { this.source = source; } void docSource(BytesReference docSource) { this.docSource = docSource; } void onlyCount(boolean onlyCount) { this.onlyCount = onlyCount; } public int getNumberOfShards() { return numberOfShards; } public long getStartTime() { return startTime; } void startTime(long startTime) { this.startTime = startTime; } OriginalIndices originalIndices() { return originalIndices; } @Override public void readFrom(StreamInput in) throws IOException { super.readFrom(in); documentType = in.readString(); source = in.readBytesReference(); docSource = in.readBytesReference(); onlyCount = in.readBoolean(); numberOfShards = in.readVInt(); startTime = in.readLong(); // no vlong, this can be negative! if (in.available() > 0 && in.readBoolean()) { // read tokenRanges Object[] tokens = (Object[]) in.readGenericValue(); this.tokenRanges = new ArrayList<Range<Token>>(tokens.length / 2); for (int i = 0; i < tokens.length;) { Range<Token> range = new Range<Token>((Token) tokens[i++], (Token) tokens[i++]); this.tokenRanges.add(range); } } } @Override public void writeTo(StreamOutput out) throws IOException { super.writeTo(out); out.writeString(documentType); out.writeBytesReference(source); out.writeBytesReference(docSource); out.writeBoolean(onlyCount); out.writeVInt(numberOfShards); out.writeLong(startTime); // write tokenRanges if (tokenRanges != null) { out.writeBoolean(tokenRanges != null); Token[] tokens = new Token[tokenRanges.size() * 2]; int i = 0; for (Range<Token> range : tokenRanges) { tokens[i++] = range.left; tokens[i++] = range.right; } out.writeGenericValue(tokens); } } }