@@ -100,6 +100,66 @@ public void testGetForFieldDefaults() {
100100 assertTrue (fd instanceof SortedNumericDVIndexFieldData );
101101 }
102102
103+ public void testClearField () throws Exception {
104+ final IndexService indexService = createIndex ("test" );
105+ final IndicesService indicesService = getInstanceFromNode (IndicesService .class );
106+ // copy the ifdService since we can set the listener only once.
107+ final IndexFieldDataService ifdService = new IndexFieldDataService (indexService .getIndexSettings (),
108+ indicesService .getIndicesFieldDataCache (), indicesService .getCircuitBreakerService (), indexService .mapperService ());
109+
110+ final BuilderContext ctx = new BuilderContext (indexService .getIndexSettings ().getSettings (), new ContentPath (1 ));
111+ final MappedFieldType mapper1 = new TextFieldMapper .Builder ("field_1" ).fielddata (true ).build (ctx ).fieldType ();
112+ final MappedFieldType mapper2 = new TextFieldMapper .Builder ("field_2" ).fielddata (true ).build (ctx ).fieldType ();
113+ final IndexWriter writer = new IndexWriter (new RAMDirectory (), new IndexWriterConfig (new KeywordAnalyzer ()));
114+ Document doc = new Document ();
115+ doc .add (new StringField ("field_1" , "thisisastring" , Store .NO ));
116+ doc .add (new StringField ("field_2" , "thisisanotherstring" , Store .NO ));
117+ writer .addDocument (doc );
118+ final IndexReader reader = DirectoryReader .open (writer );
119+ final AtomicInteger onCacheCalled = new AtomicInteger ();
120+ final AtomicInteger onRemovalCalled = new AtomicInteger ();
121+ ifdService .setListener (new IndexFieldDataCache .Listener () {
122+ @ Override
123+ public void onCache (ShardId shardId , String fieldName , Accountable ramUsage ) {
124+ onCacheCalled .incrementAndGet ();
125+ }
126+
127+ @ Override
128+ public void onRemoval (ShardId shardId , String fieldName , boolean wasEvicted , long sizeInBytes ) {
129+ onRemovalCalled .incrementAndGet ();
130+ }
131+ });
132+ IndexFieldData <?> ifd1 = ifdService .getForField (mapper1 );
133+ IndexFieldData <?> ifd2 = ifdService .getForField (mapper2 );
134+ LeafReaderContext leafReaderContext = reader .getContext ().leaves ().get (0 );
135+ AtomicFieldData loadField1 = ifd1 .load (leafReaderContext );
136+ AtomicFieldData loadField2 = ifd2 .load (leafReaderContext );
137+
138+ assertEquals (2 , onCacheCalled .get ());
139+ assertEquals (0 , onRemovalCalled .get ());
140+
141+ ifdService .clearField ("field_1" );
142+
143+ assertEquals (2 , onCacheCalled .get ());
144+ assertEquals (1 , onRemovalCalled .get ());
145+
146+ ifdService .clearField ("field_1" );
147+
148+ assertEquals (2 , onCacheCalled .get ());
149+ assertEquals (1 , onRemovalCalled .get ());
150+
151+ ifdService .clearField ("field_2" );
152+
153+ assertEquals (2 , onCacheCalled .get ());
154+ assertEquals (2 , onRemovalCalled .get ());
155+
156+ reader .close ();
157+ loadField1 .close ();
158+ loadField2 .close ();
159+ writer .close ();
160+ ifdService .clear ();
161+ }
162+
103163 public void testFieldDataCacheListener () throws Exception {
104164 final IndexService indexService = createIndex ("test" );
105165 final IndicesService indicesService = getInstanceFromNode (IndicesService .class );
0 commit comments