@@ -80,11 +80,6 @@ private SearchContextStats(List<SearchExecutionContext> contexts) {
8080 assert contexts != null && contexts .isEmpty () == false ;
8181 }
8282
83- public boolean exists (String field ) {
84- var stat = cache .computeIfAbsent (field , this ::makeFieldStats );
85- return stat .config .exists ;
86- }
87-
8883 private FieldStats makeFieldStats (String field ) {
8984 var stat = new FieldStats ();
9085 stat .config = makeFieldConfig (field );
@@ -123,19 +118,30 @@ private FieldConfig makeFieldConfig(String field) {
123118 }
124119 }
125120
121+ private boolean fastNoCacheFieldExists (String field ) {
122+ for (SearchExecutionContext context : contexts ) {
123+ if (context .isFieldMapped (field )) {
124+ return true ;
125+ }
126+ }
127+ return false ;
128+ }
129+
130+ public boolean exists (String field ) {
131+ var stat = cache .get (field );
132+ return stat != null ? stat .config .exists : fastNoCacheFieldExists (field );
133+ }
134+
126135 public boolean isIndexed (String field ) {
127- var stat = cache .computeIfAbsent (field , this ::makeFieldStats );
128- return stat .config .indexed ;
136+ return cache .computeIfAbsent (field , this ::makeFieldStats ).config .indexed ;
129137 }
130138
131139 public boolean hasDocValues (String field ) {
132- var stat = cache .computeIfAbsent (field , this ::makeFieldStats );
133- return stat .config .hasDocValues ;
140+ return cache .computeIfAbsent (field , this ::makeFieldStats ).config .hasDocValues ;
134141 }
135142
136143 public boolean hasExactSubfield (String field ) {
137- var stat = cache .computeIfAbsent (field , this ::makeFieldStats );
138- return stat .config .hasExactSubfield ;
144+ return cache .computeIfAbsent (field , this ::makeFieldStats ).config .hasExactSubfield ;
139145 }
140146
141147 public long count () {
@@ -218,7 +224,7 @@ public boolean isSingleValue(String field) {
218224 var stat = cache .computeIfAbsent (field , this ::makeFieldStats );
219225 if (stat .singleValue == null ) {
220226 // there's no such field so no need to worry about multi-value fields
221- if (exists ( field ) == false ) {
227+ if (stat . config . exists == false ) {
222228 stat .singleValue = true ;
223229 } else {
224230 // fields are MV per default
0 commit comments