/* * Copyright (c) 2017 Strapdata (http://www.strapdata.com) * Contains some code from Elasticsearch (http://www.elastic.co) * * Licensed 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.elassandra; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.lessThan; import java.util.Collections; import org.apache.cassandra.db.ConsistencyLevel; import org.apache.cassandra.dht.Murmur3Partitioner.LongToken; import org.apache.cassandra.dht.Range; import org.apache.cassandra.dht.Token; import org.elasticsearch.action.admin.indices.segments.IndexShardSegments; import org.elasticsearch.action.admin.indices.segments.ShardSegments; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentFactory; import org.elasticsearch.index.engine.Segment; import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.test.ESSingleNodeTestCase; import org.junit.Test; /** * @author vroyer * */ //mvn test -Pdev -pl com.strapdata.elasticsearch:elasticsearch -Dtests.seed=622A2B0618CE4676 -Dtests.class=org.elassandra.TokenRangesBisetCacheTests -Des.logger.lel=ERROR -Dtests.assertion.disabled=false -Dtests.security.manager=false -Dtests.heap.size=1024m -Dtests.locale=ro-RO -Dtests.timezone=America/Toronto public class TokenRangesBisetCacheTests extends ESSingleNodeTestCase { static long N = 11000; // start query caching at 10k @Test public void tokenBitsetTest() throws Exception { process(ConsistencyLevel.ONE,"CREATE KEYSPACE IF NOT EXISTS test WITH replication={ 'class':'NetworkTopologyStrategy', 'DC1':'1' }"); process(ConsistencyLevel.ONE,"CREATE TABLE IF NOT EXISTS test.t1 ( a int,b bigint, primary key (a) )"); XContentBuilder mapping = XContentFactory.jsonBuilder().startObject().startObject("t1").field("discover", ".*").endObject().endObject(); createIndex("test", Settings.builder() .put("index.token_ranges_bitset_cache",true) .put("index.queries.cache.enabled",true) .build(),"t1", mapping); ensureGreen("test"); for(int j=0 ; j < N; j++) process(ConsistencyLevel.ONE,"insert into test.t1 (a,b) VALUES (?,?)", j, ESSingleNodeTestCase.randomLong()); // ensure we have at least one segment > 10k docs. client().admin().indices().prepareForceMerge("test").setMaxNumSegments(1).setFlush(true).get(); boolean hasOneBigSegment = false; for(IndexShardSegments iss : client().admin().indices().prepareSegments("test").get().getIndices().get("test")) { for(ShardSegments ss : iss.getShards()) { for(Segment seg : ss.getSegments()) { if (seg.getNumDocs() > 10000) hasOneBigSegment = true; } } } assertThat(hasOneBigSegment, equalTo(true)); // force caching after 20 requests. long nbHits = 0; for(int i=0; i< 30 ; i++) nbHits = client().prepareSearch().setIndices("test").setTypes("t1") .setQuery(QueryBuilders.rangeQuery("b").from(0).to(Long.MAX_VALUE)) .setTokenRanges(Collections.singleton(new Range<Token>(new LongToken(Long.MIN_VALUE+1), new LongToken(Long.MAX_VALUE-1)))) .get().getHits().getTotalHits(); long upper = client().prepareSearch().setIndices("test").setTypes("t1") .setQuery(QueryBuilders.rangeQuery("b").from(0).to(Long.MAX_VALUE)) .setTokenRanges(Collections.singleton(new Range<Token>(new LongToken(0), new LongToken(Long.MAX_VALUE-1)))) .get().getHits().getTotalHits(); assertThat(upper, lessThan(nbHits)); long lower = client().prepareSearch().setIndices("test").setTypes("t1") .setQuery(QueryBuilders.rangeQuery("b").from(0).to(Long.MAX_VALUE)) .setTokenRanges(Collections.singleton(new Range<Token>(new LongToken(Long.MIN_VALUE+1), new LongToken(0)))) .get().getHits().getTotalHits(); assertThat(lower, lessThan(nbHits)); assertThat(lower+upper, equalTo(nbHits)); assertThat(client().prepareSearch().setIndices("test").setTypes("t1").setQuery(QueryBuilders.matchAllQuery()).get().getHits().getTotalHits(), equalTo(N)); } }