66package org .opensearch .sql .opensearch .storage ;
77
88import com .google .common .annotations .VisibleForTesting ;
9+ import java .lang .ref .SoftReference ;
910import java .util .HashMap ;
1011import java .util .LinkedHashMap ;
1112import java .util .Map ;
4849
4950/** OpenSearch table (index) implementation. */
5051public class OpenSearchIndex extends AbstractOpenSearchTable {
51-
5252 public static final String METADATA_FIELD_ID = "_id" ;
5353 public static final String METADATA_FIELD_INDEX = "_index" ;
5454 public static final String METADATA_FIELD_SCORE = "_score" ;
@@ -77,14 +77,23 @@ public class OpenSearchIndex extends AbstractOpenSearchTable {
7777 /** {@link OpenSearchRequest.IndexName}. */
7878 private final OpenSearchRequest .IndexName indexName ;
7979
80- /** The cached mapping of field and type in index. */
81- private Map <String , OpenSearchDataType > cachedFieldOpenSearchTypes = null ;
80+ /**
81+ * The cached mapping of field and type in index. Do not call cachedFieldOpenSearchTypes.get()
82+ * directly, use {@link #getFieldOpenSearchTypes() instead }
83+ */
84+ private SoftReference <Map <String , OpenSearchDataType >> cachedFieldOpenSearchTypes = null ;
8285
83- /** The cached ExprType of fields. */
84- private Map <String , ExprType > cachedFieldTypes = null ;
86+ /**
87+ * The cached ExprType of fields. Do not call cachedFieldTypes.get() directly, use {@link
88+ * #getFieldTypes() instead }
89+ */
90+ private SoftReference <Map <String , ExprType >> cachedFieldTypes = null ;
8591
86- /** The cached mapping of alias type field to its original path. */
87- private Map <String , String > aliasMapping = null ;
92+ /**
93+ * The cached mapping of alias type field to its original path. Do not call aliasMapping.get()
94+ * directly, use {@link #getAliasMapping() instead }
95+ */
96+ private SoftReference <Map <String , String >> aliasMapping = null ;
8897
8998 /** The cached max result window setting of index. */
9099 private Integer cachedMaxResultWindow = null ;
@@ -132,19 +141,23 @@ public void create(Map<String, ExprType> schema) {
132141 */
133142 @ Override
134143 public Map <String , ExprType > getFieldTypes () {
135- if (cachedFieldOpenSearchTypes == null ) {
144+ if (cachedFieldOpenSearchTypes == null || cachedFieldOpenSearchTypes . get () == null ) {
136145 cachedFieldOpenSearchTypes =
137- new OpenSearchDescribeIndexRequest (client , indexName ).getFieldTypes ();
146+ new SoftReference <>(
147+ new OpenSearchDescribeIndexRequest (client , indexName ).getFieldTypes ());
138148 }
139- if (cachedFieldTypes == null ) {
149+ if (cachedFieldTypes == null || cachedFieldTypes . get () == null ) {
140150 cachedFieldTypes =
141- OpenSearchDataType .traverseAndFlatten (cachedFieldOpenSearchTypes ).entrySet ().stream ()
142- .collect (
143- LinkedHashMap ::new ,
144- (map , item ) -> map .put (item .getKey (), item .getValue ().getExprType ()),
145- Map ::putAll );
151+ new SoftReference <>(
152+ OpenSearchDataType .traverseAndFlatten (cachedFieldOpenSearchTypes .get ())
153+ .entrySet ()
154+ .stream ()
155+ .collect (
156+ LinkedHashMap ::new ,
157+ (map , item ) -> map .put (item .getKey (), item .getValue ().getExprType ()),
158+ Map ::putAll ));
146159 }
147- return cachedFieldTypes ;
160+ return cachedFieldTypes . get () ;
148161 }
149162
150163 @ Override
@@ -153,19 +166,21 @@ public Map<String, ExprType> getReservedFieldTypes() {
153166 }
154167
155168 public Map <String , String > getAliasMapping () {
156- if (cachedFieldOpenSearchTypes == null ) {
169+ if (cachedFieldOpenSearchTypes == null || cachedFieldOpenSearchTypes . get () == null ) {
157170 cachedFieldOpenSearchTypes =
158- new OpenSearchDescribeIndexRequest (client , indexName ).getFieldTypes ();
171+ new SoftReference <>(
172+ new OpenSearchDescribeIndexRequest (client , indexName ).getFieldTypes ());
159173 }
160- if (aliasMapping == null ) {
174+ if (aliasMapping == null || aliasMapping . get () == null ) {
161175 aliasMapping =
162- cachedFieldOpenSearchTypes .entrySet ().stream ()
163- .filter (entry -> entry .getValue ().getOriginalPath ().isPresent ())
164- .collect (
165- Collectors .toUnmodifiableMap (
166- Entry ::getKey , entry -> entry .getValue ().getOriginalPath ().get ()));
176+ new SoftReference <>(
177+ cachedFieldOpenSearchTypes .get ().entrySet ().stream ()
178+ .filter (entry -> entry .getValue ().getOriginalPath ().isPresent ())
179+ .collect (
180+ Collectors .toUnmodifiableMap (
181+ Entry ::getKey , entry -> entry .getValue ().getOriginalPath ().get ())));
167182 }
168- return aliasMapping ;
183+ return aliasMapping . get () ;
169184 }
170185
171186 /**
@@ -174,11 +189,12 @@ public Map<String, String> getAliasMapping() {
174189 * @return A complete map between field names and their types.
175190 */
176191 public Map <String , OpenSearchDataType > getFieldOpenSearchTypes () {
177- if (cachedFieldOpenSearchTypes == null ) {
192+ if (cachedFieldOpenSearchTypes == null || cachedFieldOpenSearchTypes . get () == null ) {
178193 cachedFieldOpenSearchTypes =
179- new OpenSearchDescribeIndexRequest (client , indexName ).getFieldTypes ();
194+ new SoftReference <>(
195+ new OpenSearchDescribeIndexRequest (client , indexName ).getFieldTypes ());
180196 }
181- return cachedFieldOpenSearchTypes ;
197+ return cachedFieldOpenSearchTypes . get () ;
182198 }
183199
184200 /** Get the max result window setting of the table. */
@@ -207,7 +223,7 @@ public TableScanBuilder createScanBuilder() {
207223 client ,
208224 requestBuilder .getMaxResponseSize (),
209225 requestBuilder .build (
210- indexName , cursorKeepAlive , client , cachedFieldOpenSearchTypes .isEmpty ()));
226+ indexName , cursorKeepAlive , client , getFieldOpenSearchTypes () .isEmpty ()));
211227 return new OpenSearchIndexScanBuilder (builder , createScanOperator );
212228 }
213229
@@ -266,6 +282,6 @@ public OpenSearchResourceMonitor createOpenSearchResourceMonitor() {
266282 public OpenSearchRequest buildRequest (OpenSearchRequestBuilder requestBuilder ) {
267283 final TimeValue cursorKeepAlive = settings .getSettingValue (Settings .Key .SQL_CURSOR_KEEP_ALIVE );
268284 return requestBuilder .build (
269- indexName , cursorKeepAlive , client , cachedFieldOpenSearchTypes .isEmpty ());
285+ indexName , cursorKeepAlive , client , getFieldOpenSearchTypes () .isEmpty ());
270286 }
271287}
0 commit comments