• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (C) 2019 Google LLC
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 //      http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 
15 package com.google.android.icing;
16 
17 import androidx.annotation.NonNull;
18 import androidx.annotation.Nullable;
19 import com.google.android.icing.proto.DebugInfoResultProto;
20 import com.google.android.icing.proto.DebugInfoVerbosity;
21 import com.google.android.icing.proto.DeleteByNamespaceResultProto;
22 import com.google.android.icing.proto.DeleteByQueryResultProto;
23 import com.google.android.icing.proto.DeleteBySchemaTypeResultProto;
24 import com.google.android.icing.proto.DeleteResultProto;
25 import com.google.android.icing.proto.DocumentProto;
26 import com.google.android.icing.proto.GetAllNamespacesResultProto;
27 import com.google.android.icing.proto.GetOptimizeInfoResultProto;
28 import com.google.android.icing.proto.GetResultProto;
29 import com.google.android.icing.proto.GetResultSpecProto;
30 import com.google.android.icing.proto.GetSchemaResultProto;
31 import com.google.android.icing.proto.GetSchemaTypeResultProto;
32 import com.google.android.icing.proto.IcingSearchEngineOptions;
33 import com.google.android.icing.proto.InitializeResultProto;
34 import com.google.android.icing.proto.LogSeverity;
35 import com.google.android.icing.proto.OptimizeResultProto;
36 import com.google.android.icing.proto.PersistToDiskResultProto;
37 import com.google.android.icing.proto.PersistType;
38 import com.google.android.icing.proto.PutResultProto;
39 import com.google.android.icing.proto.ReportUsageResultProto;
40 import com.google.android.icing.proto.ResetResultProto;
41 import com.google.android.icing.proto.ResultSpecProto;
42 import com.google.android.icing.proto.SchemaProto;
43 import com.google.android.icing.proto.ScoringSpecProto;
44 import com.google.android.icing.proto.SearchResultProto;
45 import com.google.android.icing.proto.SearchSpecProto;
46 import com.google.android.icing.proto.SetSchemaResultProto;
47 import com.google.android.icing.proto.StorageInfoResultProto;
48 import com.google.android.icing.proto.SuggestionResponse;
49 import com.google.android.icing.proto.SuggestionSpecProto;
50 import com.google.android.icing.proto.UsageReport;
51 
52 /**
53  * Java wrapper to access {@link IcingSearchEngineImpl}.
54  *
55  * <p>It converts byte array from {@link IcingSearchEngineImpl} to corresponding protos.
56  *
57  * <p>If this instance has been closed, the instance is no longer usable.
58  *
59  * <p>Keep this class to be non-Final so that it can be mocked in AppSearch.
60  *
61  * <p>NOTE: This class is NOT thread-safe.
62  */
63 public class IcingSearchEngine implements IcingSearchEngineInterface {
64 
65   private static final String TAG = "IcingSearchEngine";
66   private final IcingSearchEngineImpl icingSearchEngineImpl;
67 
68   /**
69    * @throws IllegalStateException if IcingSearchEngine fails to be created
70    */
IcingSearchEngine(@onNull IcingSearchEngineOptions options)71   public IcingSearchEngine(@NonNull IcingSearchEngineOptions options) {
72     icingSearchEngineImpl = new IcingSearchEngineImpl(options.toByteArray());
73   }
74 
75   @Override
close()76   public void close() {
77     icingSearchEngineImpl.close();
78   }
79 
80   @Override
finalize()81   protected void finalize() throws Throwable {
82     icingSearchEngineImpl.close();
83     super.finalize();
84   }
85 
86   @NonNull
87   @Override
initialize()88   public InitializeResultProto initialize() {
89     return IcingSearchEngineUtils.byteArrayToInitializeResultProto(
90         icingSearchEngineImpl.initialize());
91   }
92 
93   @NonNull
94   @Override
setSchema(@onNull SchemaProto schema)95   public SetSchemaResultProto setSchema(@NonNull SchemaProto schema) {
96     return setSchema(schema, /*ignoreErrorsAndDeleteDocuments=*/ false);
97   }
98 
99   @NonNull
100   @Override
setSchema( @onNull SchemaProto schema, boolean ignoreErrorsAndDeleteDocuments)101   public SetSchemaResultProto setSchema(
102       @NonNull SchemaProto schema, boolean ignoreErrorsAndDeleteDocuments) {
103     return IcingSearchEngineUtils.byteArrayToSetSchemaResultProto(
104         icingSearchEngineImpl.setSchema(schema.toByteArray(), ignoreErrorsAndDeleteDocuments));
105   }
106 
107   @NonNull
108   @Override
getSchema()109   public GetSchemaResultProto getSchema() {
110     return IcingSearchEngineUtils.byteArrayToGetSchemaResultProto(
111         icingSearchEngineImpl.getSchema());
112   }
113 
114   @NonNull
115   @Override
getSchemaType(@onNull String schemaType)116   public GetSchemaTypeResultProto getSchemaType(@NonNull String schemaType) {
117     return IcingSearchEngineUtils.byteArrayToGetSchemaTypeResultProto(
118         icingSearchEngineImpl.getSchemaType(schemaType));
119   }
120 
121   @NonNull
122   @Override
put(@onNull DocumentProto document)123   public PutResultProto put(@NonNull DocumentProto document) {
124     return IcingSearchEngineUtils.byteArrayToPutResultProto(
125         icingSearchEngineImpl.put(document.toByteArray()));
126   }
127 
128   @NonNull
129   @Override
get( @onNull String namespace, @NonNull String uri, @NonNull GetResultSpecProto getResultSpec)130   public GetResultProto get(
131       @NonNull String namespace, @NonNull String uri, @NonNull GetResultSpecProto getResultSpec) {
132     return IcingSearchEngineUtils.byteArrayToGetResultProto(
133         icingSearchEngineImpl.get(namespace, uri, getResultSpec.toByteArray()));
134   }
135 
136   @NonNull
137   @Override
reportUsage(@onNull UsageReport usageReport)138   public ReportUsageResultProto reportUsage(@NonNull UsageReport usageReport) {
139     return IcingSearchEngineUtils.byteArrayToReportUsageResultProto(
140         icingSearchEngineImpl.reportUsage(usageReport.toByteArray()));
141   }
142 
143   @NonNull
144   @Override
getAllNamespaces()145   public GetAllNamespacesResultProto getAllNamespaces() {
146     return IcingSearchEngineUtils.byteArrayToGetAllNamespacesResultProto(
147         icingSearchEngineImpl.getAllNamespaces());
148   }
149 
150   @NonNull
151   @Override
search( @onNull SearchSpecProto searchSpec, @NonNull ScoringSpecProto scoringSpec, @NonNull ResultSpecProto resultSpec)152   public SearchResultProto search(
153       @NonNull SearchSpecProto searchSpec,
154       @NonNull ScoringSpecProto scoringSpec,
155       @NonNull ResultSpecProto resultSpec) {
156     return IcingSearchEngineUtils.byteArrayToSearchResultProto(
157         icingSearchEngineImpl.search(
158             searchSpec.toByteArray(), scoringSpec.toByteArray(), resultSpec.toByteArray()));
159   }
160 
161   @NonNull
162   @Override
getNextPage(long nextPageToken)163   public SearchResultProto getNextPage(long nextPageToken) {
164     return IcingSearchEngineUtils.byteArrayToSearchResultProto(
165         icingSearchEngineImpl.getNextPage(nextPageToken));
166   }
167 
168   @NonNull
169   @Override
invalidateNextPageToken(long nextPageToken)170   public void invalidateNextPageToken(long nextPageToken) {
171     icingSearchEngineImpl.invalidateNextPageToken(nextPageToken);
172   }
173 
174   @NonNull
175   @Override
delete(@onNull String namespace, @NonNull String uri)176   public DeleteResultProto delete(@NonNull String namespace, @NonNull String uri) {
177     return IcingSearchEngineUtils.byteArrayToDeleteResultProto(
178         icingSearchEngineImpl.delete(namespace, uri));
179   }
180 
181   @NonNull
182   @Override
searchSuggestions(@onNull SuggestionSpecProto suggestionSpec)183   public SuggestionResponse searchSuggestions(@NonNull SuggestionSpecProto suggestionSpec) {
184     return IcingSearchEngineUtils.byteArrayToSuggestionResponse(
185         icingSearchEngineImpl.searchSuggestions(suggestionSpec.toByteArray()));
186   }
187 
188   @NonNull
189   @Override
deleteByNamespace(@onNull String namespace)190   public DeleteByNamespaceResultProto deleteByNamespace(@NonNull String namespace) {
191     return IcingSearchEngineUtils.byteArrayToDeleteByNamespaceResultProto(
192         icingSearchEngineImpl.deleteByNamespace(namespace));
193   }
194 
195   @NonNull
196   @Override
deleteBySchemaType(@onNull String schemaType)197   public DeleteBySchemaTypeResultProto deleteBySchemaType(@NonNull String schemaType) {
198     return IcingSearchEngineUtils.byteArrayToDeleteBySchemaTypeResultProto(
199         icingSearchEngineImpl.deleteBySchemaType(schemaType));
200   }
201 
202   @NonNull
203   @Override
deleteByQuery(@onNull SearchSpecProto searchSpec)204   public DeleteByQueryResultProto deleteByQuery(@NonNull SearchSpecProto searchSpec) {
205     return deleteByQuery(searchSpec, /*returnDeletedDocumentInfo=*/ false);
206   }
207 
208   @NonNull
209   @Override
deleteByQuery( @onNull SearchSpecProto searchSpec, boolean returnDeletedDocumentInfo)210   public DeleteByQueryResultProto deleteByQuery(
211       @NonNull SearchSpecProto searchSpec, boolean returnDeletedDocumentInfo) {
212     return IcingSearchEngineUtils.byteArrayToDeleteByQueryResultProto(
213         icingSearchEngineImpl.deleteByQuery(searchSpec.toByteArray(), returnDeletedDocumentInfo));
214   }
215 
216   @NonNull
217   @Override
persistToDisk(@onNull PersistType.Code persistTypeCode)218   public PersistToDiskResultProto persistToDisk(@NonNull PersistType.Code persistTypeCode) {
219     return IcingSearchEngineUtils.byteArrayToPersistToDiskResultProto(
220         icingSearchEngineImpl.persistToDisk(persistTypeCode.getNumber()));
221   }
222 
223   @NonNull
224   @Override
optimize()225   public OptimizeResultProto optimize() {
226     return IcingSearchEngineUtils.byteArrayToOptimizeResultProto(icingSearchEngineImpl.optimize());
227   }
228 
229   @NonNull
230   @Override
getOptimizeInfo()231   public GetOptimizeInfoResultProto getOptimizeInfo() {
232     return IcingSearchEngineUtils.byteArrayToGetOptimizeInfoResultProto(
233         icingSearchEngineImpl.getOptimizeInfo());
234   }
235 
236   @NonNull
237   @Override
getStorageInfo()238   public StorageInfoResultProto getStorageInfo() {
239     return IcingSearchEngineUtils.byteArrayToStorageInfoResultProto(
240         icingSearchEngineImpl.getStorageInfo());
241   }
242 
243   @NonNull
244   @Override
getDebugInfo(DebugInfoVerbosity.Code verbosity)245   public DebugInfoResultProto getDebugInfo(DebugInfoVerbosity.Code verbosity) {
246     return IcingSearchEngineUtils.byteArrayToDebugInfoResultProto(
247         icingSearchEngineImpl.getDebugInfo(verbosity.getNumber()));
248   }
249 
250   @NonNull
251   @Override
reset()252   public ResetResultProto reset() {
253     return IcingSearchEngineUtils.byteArrayToResetResultProto(icingSearchEngineImpl.reset());
254   }
255 
shouldLog(LogSeverity.Code severity)256   public static boolean shouldLog(LogSeverity.Code severity) {
257     return shouldLog(severity, (short) 0);
258   }
259 
shouldLog(LogSeverity.Code severity, short verbosity)260   public static boolean shouldLog(LogSeverity.Code severity, short verbosity) {
261     return IcingSearchEngineImpl.shouldLog((short) severity.getNumber(), verbosity);
262   }
263 
setLoggingLevel(LogSeverity.Code severity)264   public static boolean setLoggingLevel(LogSeverity.Code severity) {
265     return setLoggingLevel(severity, (short) 0);
266   }
267 
setLoggingLevel(LogSeverity.Code severity, short verbosity)268   public static boolean setLoggingLevel(LogSeverity.Code severity, short verbosity) {
269     return IcingSearchEngineImpl.setLoggingLevel((short) severity.getNumber(), verbosity);
270   }
271 
272   @Nullable
getLoggingTag()273   public static String getLoggingTag() {
274     return IcingSearchEngineImpl.getLoggingTag();
275   }
276 }
277