@@ -151,7 +151,7 @@ public void testBasics() throws IOException {
151151 assertEquals (1L , stats .getCacheSize ());
152152 assertEquals (1L , stats .getCacheCount ());
153153 assertEquals (0L , stats .getHitCount ());
154- assertEquals (1L , stats .getMissCount ());
154+ assertEquals (2L , stats .getMissCount ());
155155 assertTrue (stats .getMemorySizeInBytes () > 0L && stats .getMemorySizeInBytes () < Long .MAX_VALUE );
156156
157157 for (int i = 1 ; i < 20 ; ++i ) {
@@ -162,7 +162,7 @@ public void testBasics() throws IOException {
162162 assertEquals (10L , stats .getCacheSize ());
163163 assertEquals (20L , stats .getCacheCount ());
164164 assertEquals (0L , stats .getHitCount ());
165- assertEquals (20L , stats .getMissCount ());
165+ assertEquals (40L , stats .getMissCount ());
166166 assertTrue (stats .getMemorySizeInBytes () > 0L && stats .getMemorySizeInBytes () < Long .MAX_VALUE );
167167
168168 s .count (new DummyQuery (10 ));
@@ -171,7 +171,7 @@ public void testBasics() throws IOException {
171171 assertEquals (10L , stats .getCacheSize ());
172172 assertEquals (20L , stats .getCacheCount ());
173173 assertEquals (1L , stats .getHitCount ());
174- assertEquals (20L , stats .getMissCount ());
174+ assertEquals (40L , stats .getMissCount ());
175175 assertTrue (stats .getMemorySizeInBytes () > 0L && stats .getMemorySizeInBytes () < Long .MAX_VALUE );
176176
177177 IOUtils .close (r , dir );
@@ -181,7 +181,7 @@ public void testBasics() throws IOException {
181181 assertEquals (0L , stats .getCacheSize ());
182182 assertEquals (20L , stats .getCacheCount ());
183183 assertEquals (1L , stats .getHitCount ());
184- assertEquals (20L , stats .getMissCount ());
184+ assertEquals (40L , stats .getMissCount ());
185185 assertTrue (stats .getMemorySizeInBytes () > 0L && stats .getMemorySizeInBytes () < Long .MAX_VALUE );
186186
187187 cache .onClose (shard );
@@ -232,7 +232,7 @@ public void testTwoShards() throws IOException {
232232 assertEquals (1L , stats1 .getCacheSize ());
233233 assertEquals (1L , stats1 .getCacheCount ());
234234 assertEquals (0L , stats1 .getHitCount ());
235- assertEquals (1L , stats1 .getMissCount ());
235+ assertEquals (2L , stats1 .getMissCount ());
236236 assertTrue (stats1 .getMemorySizeInBytes () >= 0L && stats1 .getMemorySizeInBytes () < Long .MAX_VALUE );
237237
238238 QueryCacheStats stats2 = cache .getStats (shard2 );
@@ -248,14 +248,14 @@ public void testTwoShards() throws IOException {
248248 assertEquals (1L , stats1 .getCacheSize ());
249249 assertEquals (1L , stats1 .getCacheCount ());
250250 assertEquals (0L , stats1 .getHitCount ());
251- assertEquals (1L , stats1 .getMissCount ());
251+ assertEquals (2L , stats1 .getMissCount ());
252252 assertTrue (stats1 .getMemorySizeInBytes () >= 0L && stats1 .getMemorySizeInBytes () < Long .MAX_VALUE );
253253
254254 stats2 = cache .getStats (shard2 );
255255 assertEquals (1L , stats2 .getCacheSize ());
256256 assertEquals (1L , stats2 .getCacheCount ());
257257 assertEquals (0L , stats2 .getHitCount ());
258- assertEquals (1L , stats2 .getMissCount ());
258+ assertEquals (2L , stats2 .getMissCount ());
259259 assertTrue (stats2 .getMemorySizeInBytes () >= 0L && stats2 .getMemorySizeInBytes () < Long .MAX_VALUE );
260260
261261 for (int i = 0 ; i < 20 ; ++i ) {
@@ -266,14 +266,14 @@ public void testTwoShards() throws IOException {
266266 assertEquals (0L , stats1 .getCacheSize ()); // evicted
267267 assertEquals (1L , stats1 .getCacheCount ());
268268 assertEquals (0L , stats1 .getHitCount ());
269- assertEquals (1L , stats1 .getMissCount ());
269+ assertEquals (2L , stats1 .getMissCount ());
270270 assertTrue (stats1 .getMemorySizeInBytes () >= 0L && stats1 .getMemorySizeInBytes () < Long .MAX_VALUE );
271271
272272 stats2 = cache .getStats (shard2 );
273273 assertEquals (10L , stats2 .getCacheSize ());
274274 assertEquals (20L , stats2 .getCacheCount ());
275275 assertEquals (1L , stats2 .getHitCount ());
276- assertEquals (20L , stats2 .getMissCount ());
276+ assertEquals (40L , stats2 .getMissCount ());
277277 assertTrue (stats2 .getMemorySizeInBytes () >= 0L && stats2 .getMemorySizeInBytes () < Long .MAX_VALUE );
278278
279279 IOUtils .close (r1 , dir1 );
@@ -283,14 +283,14 @@ public void testTwoShards() throws IOException {
283283 assertEquals (0L , stats1 .getCacheSize ());
284284 assertEquals (1L , stats1 .getCacheCount ());
285285 assertEquals (0L , stats1 .getHitCount ());
286- assertEquals (1L , stats1 .getMissCount ());
286+ assertEquals (2L , stats1 .getMissCount ());
287287 assertTrue (stats1 .getMemorySizeInBytes () >= 0L && stats1 .getMemorySizeInBytes () < Long .MAX_VALUE );
288288
289289 stats2 = cache .getStats (shard2 );
290290 assertEquals (10L , stats2 .getCacheSize ());
291291 assertEquals (20L , stats2 .getCacheCount ());
292292 assertEquals (1L , stats2 .getHitCount ());
293- assertEquals (20L , stats2 .getMissCount ());
293+ assertEquals (40L , stats2 .getMissCount ());
294294 assertTrue (stats2 .getMemorySizeInBytes () >= 0L && stats2 .getMemorySizeInBytes () < Long .MAX_VALUE );
295295
296296 cache .onClose (shard1 );
@@ -307,7 +307,7 @@ public void testTwoShards() throws IOException {
307307 assertEquals (10L , stats2 .getCacheSize ());
308308 assertEquals (20L , stats2 .getCacheCount ());
309309 assertEquals (1L , stats2 .getHitCount ());
310- assertEquals (20L , stats2 .getMissCount ());
310+ assertEquals (40L , stats2 .getMissCount ());
311311 assertTrue (stats2 .getMemorySizeInBytes () >= 0L && stats2 .getMemorySizeInBytes () < Long .MAX_VALUE );
312312
313313 IOUtils .close (r2 , dir2 );
@@ -388,8 +388,10 @@ public void testStatsOnEviction() throws IOException {
388388 private static class DummyWeight extends Weight {
389389
390390 private final Weight weight ;
391+ private final int randCount = randomIntBetween (0 , Integer .MAX_VALUE );
391392 private boolean scorerCalled ;
392393 private boolean scorerSupplierCalled ;
394+ private boolean countCalled ;
393395
394396 DummyWeight (Weight weight ) {
395397 super (weight .getQuery ());
@@ -413,6 +415,12 @@ public ScorerSupplier scorerSupplier(LeafReaderContext context) throws IOExcepti
413415 return weight .scorerSupplier (context );
414416 }
415417
418+ @ Override
419+ public int count (LeafReaderContext context ) throws IOException {
420+ countCalled = true ;
421+ return randCount ;
422+ }
423+
416424 @ Override
417425 public boolean isCacheable (LeafReaderContext ctx ) {
418426 return true ;
@@ -458,4 +466,26 @@ public void onUse(Query query) {}
458466 cache .onClose (shard );
459467 cache .close ();
460468 }
469+
470+ public void testDelegatesCount () throws Exception {
471+ Directory dir = newDirectory ();
472+ IndexWriter w = new IndexWriter (dir , newIndexWriterConfig ());
473+ w .addDocument (new Document ());
474+ DirectoryReader r = DirectoryReader .open (w );
475+ w .close ();
476+ ShardId shard = new ShardId ("index" , "_na_" , 0 );
477+ r = OpenSearchDirectoryReader .wrap (r , shard );
478+ IndexSearcher s = new IndexSearcher (r );
479+ IndicesQueryCache cache = new IndicesQueryCache (Settings .EMPTY );
480+ s .setQueryCache (cache );
481+ Query query = new MatchAllDocsQuery ();
482+ final DummyWeight weight = new DummyWeight (s .createWeight (s .rewrite (query ), ScoreMode .COMPLETE_NO_SCORES , 1f ));
483+ final Weight cached = cache .doCache (weight , s .getQueryCachingPolicy ());
484+ assertFalse (weight .countCalled );
485+ assertEquals (weight .randCount , cached .count (s .getIndexReader ().leaves ().get (0 )));
486+ assertTrue (weight .countCalled );
487+ IOUtils .close (r , dir );
488+ cache .onClose (shard );
489+ cache .close ();
490+ }
461491}
0 commit comments