/*
* 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.index.fieldstats;
import org.elasticsearch.action.admin.indices.refresh.RefreshResponse;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.search.SearchType;
import org.elasticsearch.cluster.metadata.IndexMetaData;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.indices.IndicesRequestCache;
import org.elasticsearch.rest.RestStatus;
import org.elasticsearch.test.ESSingleNodeTestCase;
import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertAcked;
import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertSearchResponse;
import static org.hamcrest.Matchers.anyOf;
import static org.hamcrest.Matchers.equalTo;
public class FieldStatsProviderRefreshTests extends ESSingleNodeTestCase {
public void testQueryRewriteOnRefresh() throws Exception {
assertAcked(client().admin().indices().prepareCreate("index").addMapping("type", "s", "type=text")
.setSettings(IndicesRequestCache.INDEX_CACHE_REQUEST_ENABLED_SETTING.getKey(), true,
IndexMetaData.SETTING_NUMBER_OF_SHARDS, 1,
IndexMetaData.SETTING_NUMBER_OF_REPLICAS, 0)
.get());
// Index some documents
indexDocument("1", "d");
indexDocument("2", "e");
indexDocument("3", "f");
refreshIndex();
// check request cache stats are clean
assertRequestCacheStats(0, 0);
// Search for a range and check that it missed the cache (since its the
// first time it has run)
final SearchResponse r1 = client().prepareSearch("index").setSearchType(SearchType.QUERY_THEN_FETCH).setSize(0)
.setQuery(QueryBuilders.rangeQuery("s").gte("a").lte("g")).get();
assertSearchResponse(r1);
assertThat(r1.getHits().getTotalHits(), equalTo(3L));
assertRequestCacheStats(0, 1);
// Search again and check it hits the cache
final SearchResponse r2 = client().prepareSearch("index").setSearchType(SearchType.QUERY_THEN_FETCH).setSize(0)
.setQuery(QueryBuilders.rangeQuery("s").gte("a").lte("g")).get();
assertSearchResponse(r2);
assertThat(r2.getHits().getTotalHits(), equalTo(3L));
assertRequestCacheStats(1, 1);
// Index some more documents in the query range and refresh
indexDocument("4", "c");
indexDocument("5", "g");
refreshIndex();
// Search again and check the request cache for another miss since request cache should be invalidated by refresh
final SearchResponse r3 = client().prepareSearch("index").setSearchType(SearchType.QUERY_THEN_FETCH).setSize(0)
.setQuery(QueryBuilders.rangeQuery("s").gte("a").lte("g")).get();
assertSearchResponse(r3);
assertThat(r3.getHits().getTotalHits(), equalTo(5L));
assertRequestCacheStats(1, 2);
}
private void assertRequestCacheStats(long expectedHits, long expectedMisses) {
assertThat(client().admin().indices().prepareStats("index").setRequestCache(true).get().getTotal().getRequestCache().getHitCount(),
equalTo(expectedHits));
assertThat(client().admin().indices().prepareStats("index").setRequestCache(true).get().getTotal().getRequestCache().getMissCount(),
equalTo(expectedMisses));
}
private void refreshIndex() {
RefreshResponse refreshResponse = client().admin().indices().prepareRefresh("index").get();
assertThat(refreshResponse.getSuccessfulShards(), equalTo(refreshResponse.getSuccessfulShards()));
}
private void indexDocument(String id, String sValue) {
IndexResponse response = client().prepareIndex("index", "type", id).setSource("s", sValue).get();
assertThat(response.status(), anyOf(equalTo(RestStatus.OK), equalTo(RestStatus.CREATED)));
}
}