more work on the groovy client - count/terms api

This commit is contained in:
kimchy 2010-04-14 13:57:40 +03:00
parent 7e041c43e0
commit 96a185e107
13 changed files with 154 additions and 27 deletions

View File

@ -36,8 +36,8 @@ import java.util.Arrays;
* A request to count the number of documents matching a specific query. Best created with
* {@link org.elasticsearch.client.Requests#countRequest(String...)}.
*
* <p>The request requires the query source to be set either using {@link #querySource(org.elasticsearch.index.query.QueryBuilder)},
* or {@link #querySource(byte[])}.
* <p>The request requires the query source to be set either using {@link #query(org.elasticsearch.index.query.QueryBuilder)},
* or {@link #query(byte[])}.
*
* @author kimchy (shay.banon)
* @see CountResponse
@ -80,6 +80,11 @@ public class CountRequest extends BroadcastOperationRequest {
return this;
}
public CountRequest indices(String... indices) {
this.indices = indices;
return this;
}
/**
* A query hint to optionally later be used when routing the request.
*/
@ -116,22 +121,22 @@ public class CountRequest extends BroadcastOperationRequest {
*
* @see org.elasticsearch.index.query.json.JsonQueryBuilders
*/
@Required public CountRequest querySource(QueryBuilder queryBuilder) {
return querySource(queryBuilder.buildAsBytes());
@Required public CountRequest query(QueryBuilder queryBuilder) {
return query(queryBuilder.buildAsBytes());
}
/**
* The query source to execute. It is preferable to use either {@link #querySource(byte[])}
* or {@link #querySource(org.elasticsearch.index.query.QueryBuilder)}.
* The query source to execute. It is preferable to use either {@link #query(byte[])}
* or {@link #query(org.elasticsearch.index.query.QueryBuilder)}.
*/
@Required public CountRequest querySource(String querySource) {
return querySource(Unicode.fromStringAsBytes(querySource));
@Required public CountRequest query(String querySource) {
return query(Unicode.fromStringAsBytes(querySource));
}
/**
* The query source to execute.
*/
@Required public CountRequest querySource(byte[] querySource) {
@Required public CountRequest query(byte[] querySource) {
this.querySource = querySource;
return this;
}

View File

@ -52,6 +52,13 @@ public class CountResponse extends BroadcastOperationResponse {
return count;
}
/**
* The count of documents matching the query provided.
*/
public long getCount() {
return count;
}
@Override public void readFrom(StreamInput in) throws IOException {
super.readFrom(in);
count = in.readVLong();

View File

@ -53,12 +53,19 @@ public class FieldTermsFreq implements Streamable, Iterable<TermFreq> {
}
/**
* The fields name.
* The field name.
*/
public String fieldName() {
return this.fieldName;
}
/**
* The field name.
*/
public String getFieldName() {
return fieldName;
}
/**
* The term frequencies of the field.
*/
@ -66,6 +73,13 @@ public class FieldTermsFreq implements Streamable, Iterable<TermFreq> {
return this.termsFreqs;
}
/**
* The term frequencies of the field.
*/
public TermFreq[] getTermsFreqs() {
return termsFreqs;
}
/**
* Returns the document frequency of a term, <tt>-1</tt> if the term does not exists.
*/

View File

@ -100,6 +100,13 @@ public class TermFreq implements Streamable {
return term;
}
/**
* The term.
*/
public Object getTerm() {
return term;
}
public String termAsString() {
return term.toString();
}
@ -111,6 +118,13 @@ public class TermFreq implements Streamable {
return docFreq;
}
/**
* The document frequency of the term (in how many documents this term exists).
*/
public int getDocFreq() {
return docFreq;
}
public static TermFreq readTermFreq(StreamInput in) throws IOException {
TermFreq termFreq = new TermFreq();
termFreq.readFrom(in);

View File

@ -70,6 +70,13 @@ public class TermsResponse extends BroadcastOperationResponse implements Iterabl
return this.numDocs;
}
/**
* The total number of documents.
*/
public long getNumDocs() {
return numDocs;
}
/**
* The total maximum number of documents (including deletions).
*/
@ -77,6 +84,13 @@ public class TermsResponse extends BroadcastOperationResponse implements Iterabl
return this.maxDoc;
}
/**
* The total maximum number of documents (including deletions).
*/
public long getMaxDoc() {
return maxDoc;
}
/**
* The number of deleted docs.
*/
@ -84,6 +98,13 @@ public class TermsResponse extends BroadcastOperationResponse implements Iterabl
return this.numDeletedDocs;
}
/**
* The number of deleted docs.
*/
public long getNumDeletedDocs() {
return numDeletedDocs;
}
/**
* Iterates over the {@link FieldTermsFreq}.
*/
@ -109,6 +130,10 @@ public class TermsResponse extends BroadcastOperationResponse implements Iterabl
return this.fieldsTermsFreq;
}
public Map<String, FieldTermsFreq> getFields() {
return fieldsAsMap();
}
/**
* The pair of field name to {@link FieldTermsFreq} as map for simpler usage.
*/

View File

@ -64,7 +64,7 @@ public class RestCountAction extends BaseRestHandler {
operationThreading = BroadcastOperationThreading.SINGLE_THREAD;
}
countRequest.operationThreading(operationThreading);
countRequest.querySource(RestActions.parseQuerySource(request));
countRequest.query(RestActions.parseQuerySource(request));
countRequest.queryParserName(request.param("query_parser_name"));
countRequest.queryHint(request.param("query_hint"));
countRequest.minScore(request.paramAsFloat("min_score", DEFAULT_MIN_SCORE));

View File

@ -41,7 +41,7 @@ import static org.elasticsearch.rest.RestResponse.Status.*;
import static org.elasticsearch.rest.action.support.RestActions.*;
/**
* @author kimchy (Shay Banon)
* @author kimchy (shay.banon)
*/
public class RestTermsAction extends BaseRestHandler {

View File

@ -75,7 +75,7 @@ public class BroadcastActionsTests extends AbstractNodesTests {
// check count
for (int i = 0; i < 5; i++) {
// test successful
CountResponse countResponse = client("server1").count(countRequest("test").querySource(termQuery("_type", "type1")).operationThreading(BroadcastOperationThreading.NO_THREADS)).actionGet();
CountResponse countResponse = client("server1").count(countRequest("test").query(termQuery("_type", "type1")).operationThreading(BroadcastOperationThreading.NO_THREADS)).actionGet();
assertThat(countResponse.count(), equalTo(2l));
assertThat(countResponse.totalShards(), equalTo(5));
assertThat(countResponse.successfulShards(), equalTo(5));
@ -83,7 +83,7 @@ public class BroadcastActionsTests extends AbstractNodesTests {
}
for (int i = 0; i < 5; i++) {
CountResponse countResponse = client("server1").count(countRequest("test").querySource(termQuery("_type", "type1")).operationThreading(BroadcastOperationThreading.SINGLE_THREAD)).actionGet();
CountResponse countResponse = client("server1").count(countRequest("test").query(termQuery("_type", "type1")).operationThreading(BroadcastOperationThreading.SINGLE_THREAD)).actionGet();
assertThat(countResponse.count(), equalTo(2l));
assertThat(countResponse.totalShards(), equalTo(5));
assertThat(countResponse.successfulShards(), equalTo(5));
@ -91,7 +91,7 @@ public class BroadcastActionsTests extends AbstractNodesTests {
}
for (int i = 0; i < 5; i++) {
CountResponse countResponse = client("server1").count(countRequest("test").querySource(termQuery("_type", "type1")).operationThreading(BroadcastOperationThreading.THREAD_PER_SHARD)).actionGet();
CountResponse countResponse = client("server1").count(countRequest("test").query(termQuery("_type", "type1")).operationThreading(BroadcastOperationThreading.THREAD_PER_SHARD)).actionGet();
assertThat(countResponse.count(), equalTo(2l));
assertThat(countResponse.totalShards(), equalTo(5));
assertThat(countResponse.successfulShards(), equalTo(5));
@ -100,7 +100,7 @@ public class BroadcastActionsTests extends AbstractNodesTests {
for (int i = 0; i < 5; i++) {
// test failed (simply query that can't be parsed)
CountResponse countResponse = client("server1").count(countRequest("test").querySource(Unicode.fromStringAsBytes("{ term : { _type : \"type1 } }"))).actionGet();
CountResponse countResponse = client("server1").count(countRequest("test").query(Unicode.fromStringAsBytes("{ term : { _type : \"type1 } }"))).actionGet();
assertThat(countResponse.count(), equalTo(0l));
assertThat(countResponse.totalShards(), equalTo(5));

View File

@ -170,23 +170,23 @@ public class DocumentActionsTests extends AbstractNodesTests {
// check count
for (int i = 0; i < 5; i++) {
// test successful
CountResponse countResponse = client1.count(countRequest("test").querySource(termQuery("_type", "type1")).operationThreading(BroadcastOperationThreading.NO_THREADS)).actionGet();
CountResponse countResponse = client1.count(countRequest("test").query(termQuery("_type", "type1")).operationThreading(BroadcastOperationThreading.NO_THREADS)).actionGet();
assertThat(countResponse.count(), equalTo(2l));
assertThat(countResponse.successfulShards(), equalTo(5));
assertThat(countResponse.failedShards(), equalTo(0));
countResponse = client1.count(countRequest("test").querySource(termQuery("_type", "type1")).operationThreading(BroadcastOperationThreading.SINGLE_THREAD)).actionGet();
countResponse = client1.count(countRequest("test").query(termQuery("_type", "type1")).operationThreading(BroadcastOperationThreading.SINGLE_THREAD)).actionGet();
assertThat(countResponse.count(), equalTo(2l));
assertThat(countResponse.successfulShards(), equalTo(5));
assertThat(countResponse.failedShards(), equalTo(0));
countResponse = client1.count(countRequest("test").querySource(termQuery("_type", "type1")).operationThreading(BroadcastOperationThreading.THREAD_PER_SHARD)).actionGet();
countResponse = client1.count(countRequest("test").query(termQuery("_type", "type1")).operationThreading(BroadcastOperationThreading.THREAD_PER_SHARD)).actionGet();
assertThat(countResponse.count(), equalTo(2l));
assertThat(countResponse.successfulShards(), equalTo(5));
assertThat(countResponse.failedShards(), equalTo(0));
// test failed (simply query that can't be parsed)
countResponse = client1.count(countRequest("test").querySource(Unicode.fromStringAsBytes("{ term : { _type : \"type1 } }"))).actionGet();
countResponse = client1.count(countRequest("test").query(Unicode.fromStringAsBytes("{ term : { _type : \"type1 } }"))).actionGet();
assertThat(countResponse.count(), equalTo(0l));
assertThat(countResponse.successfulShards(), equalTo(0));

View File

@ -78,10 +78,10 @@ public class SimpleAttachmentIntegrationTests {
.source(jsonBuilder().startObject().field("file", copyToBytesFromClasspath("/org/elasticsearch/plugin/attachments/index/mapper/testXHTML.html")).endObject())).actionGet();
node.client().admin().indices().refresh(refreshRequest()).actionGet();
CountResponse countResponse = node.client().count(countRequest("test").querySource(fieldQuery("file.title", "test document"))).actionGet();
CountResponse countResponse = node.client().count(countRequest("test").query(fieldQuery("file.title", "test document"))).actionGet();
assertThat(countResponse.count(), equalTo(1l));
countResponse = node.client().count(countRequest("test").querySource(fieldQuery("file", "tests the ability"))).actionGet();
countResponse = node.client().count(countRequest("test").query(fieldQuery("file", "tests the ability"))).actionGet();
assertThat(countResponse.count(), equalTo(1l));
}
}

View File

@ -20,6 +20,8 @@
package org.elasticsearch.groovy.client
import org.elasticsearch.action.ActionListener
import org.elasticsearch.action.count.CountRequest
import org.elasticsearch.action.count.CountResponse
import org.elasticsearch.action.delete.DeleteRequest
import org.elasticsearch.action.delete.DeleteResponse
import org.elasticsearch.action.deletebyquery.DeleteByQueryRequest
@ -28,6 +30,8 @@ import org.elasticsearch.action.get.GetRequest
import org.elasticsearch.action.get.GetResponse
import org.elasticsearch.action.index.IndexRequest
import org.elasticsearch.action.index.IndexResponse
import org.elasticsearch.action.terms.TermsRequest
import org.elasticsearch.action.terms.TermsResponse
import org.elasticsearch.client.Client
import org.elasticsearch.client.internal.InternalClient
import org.elasticsearch.groovy.client.action.GActionFuture
@ -52,10 +56,19 @@ class GClient {
DeleteByQueryRequest.metaClass.query = {Closure c ->
delegate.query(new JsonBuilder().buildAsBytes(c))
}
CountRequest.metaClass.setQuery = {Closure c ->
delegate.query(new JsonBuilder().buildAsBytes(c))
}
CountRequest.metaClass.query = {Closure c ->
delegate.query(new JsonBuilder().buildAsBytes(c))
}
}
final Client client;
int resolveStrategy = Closure.DELEGATE_FIRST
private final InternalClient internalClient
final GAdminClient admin;
@ -70,7 +83,7 @@ class GClient {
GActionFuture<IndexResponse> index(Closure c) {
IndexRequest request = new IndexRequest()
c.setDelegate request
c.resolveStrategy = Closure.DELEGATE_FIRST
c.resolveStrategy = resolveStrategy
c.call()
index(request)
}
@ -88,7 +101,7 @@ class GClient {
GActionFuture<GetResponse> get(Closure c) {
GetRequest request = new GetRequest()
c.setDelegate request
c.resolveStrategy = Closure.DELEGATE_FIRST
c.resolveStrategy = resolveStrategy
c.call()
get(request)
}
@ -105,7 +118,7 @@ class GClient {
GActionFuture<DeleteResponse> delete(Closure c) {
DeleteRequest request = new DeleteRequest()
c.resolveStrategy = Closure.DELEGATE_FIRST
c.resolveStrategy = resolveStrategy
c.setDelegate request
c.call()
delete(request)
@ -123,7 +136,7 @@ class GClient {
GActionFuture<DeleteByQueryResponse> deleteByQuery(Closure c) {
DeleteByQueryRequest request = new DeleteByQueryRequest()
c.resolveStrategy = Closure.DELEGATE_FIRST
c.resolveStrategy = resolveStrategy
c.setDelegate request
c.call()
deleteByQuery(request)
@ -138,4 +151,40 @@ class GClient {
void deleteByQuery(DeleteByQueryRequest request, ActionListener<DeleteByQueryResponse> listener) {
client.deleteByQuery(request, listener)
}
GActionFuture<CountResponse> count(Closure c) {
CountRequest request = new CountRequest()
c.resolveStrategy = resolveStrategy
c.setDelegate request
c.call()
count(request)
}
GActionFuture<CountResponse> count(CountRequest request) {
GActionFuture<CountResponse> future = new GActionFuture<CountResponse>(internalClient.threadPool(), request);
client.count(request, future)
return future
}
void count(CountRequest request, ActionListener<CountResponse> listener) {
client.count(request, listener)
}
GActionFuture<TermsResponse> terms(Closure c) {
TermsRequest request = new TermsRequest()
c.resolveStrategy = resolveStrategy
c.setDelegate request
c.call()
terms(request)
}
GActionFuture<TermsResponse> terms(TermsRequest request) {
GActionFuture<TermsResponse> future = new GActionFuture<TermsResponse>(internalClient.threadPool(), request);
client.terms(request, future)
return future
}
void terms(TermsRequest request, ActionListener<TermsResponse> listener) {
client.terms(request, listener)
}
}

View File

@ -27,7 +27,7 @@ class GIndicesAdminClient {
GActionFuture<RefreshResponse> refresh(Closure c) {
RefreshRequest request = new RefreshRequest()
c.setDelegate request
c.resolveStrategy = Closure.DELEGATE_FIRST
c.resolveStrategy = gClient.resolveStrategy
c.call()
refresh(request)
}

View File

@ -157,6 +157,19 @@ class SimpleActionsTests extends GroovyTestCase {
}
assertTrue getR.response.exists
def count = node.client.count {
indices "test"
types "type1"
query {
term {
test = "value"
}
}
}
assertEquals 0, count.response.failedShards
assertEquals 1, count.response.count
def deleteByQuery = node.client.deleteByQuery {
indices "test"
query {