• 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   @NonNull
81   @Override
initialize()82   public InitializeResultProto initialize() {
83     return IcingSearchEngineUtils.byteArrayToInitializeResultProto(
84         icingSearchEngineImpl.initialize());
85   }
86 
87   @NonNull
88   @Override
setSchema(@onNull SchemaProto schema)89   public SetSchemaResultProto setSchema(@NonNull SchemaProto schema) {
90     return setSchema(schema, /*ignoreErrorsAndDeleteDocuments=*/ false);
91   }
92 
93   @NonNull
94   @Override
setSchema( @onNull SchemaProto schema, boolean ignoreErrorsAndDeleteDocuments)95   public SetSchemaResultProto setSchema(
96       @NonNull SchemaProto schema, boolean ignoreErrorsAndDeleteDocuments) {
97     return IcingSearchEngineUtils.byteArrayToSetSchemaResultProto(
98         icingSearchEngineImpl.setSchema(schema.toByteArray(), ignoreErrorsAndDeleteDocuments));
99   }
100 
101   @NonNull
102   @Override
getSchema()103   public GetSchemaResultProto getSchema() {
104     return IcingSearchEngineUtils.byteArrayToGetSchemaResultProto(
105         icingSearchEngineImpl.getSchema());
106   }
107 
108   @NonNull
109   @Override
getSchemaType(@onNull String schemaType)110   public GetSchemaTypeResultProto getSchemaType(@NonNull String schemaType) {
111     return IcingSearchEngineUtils.byteArrayToGetSchemaTypeResultProto(
112         icingSearchEngineImpl.getSchemaType(schemaType));
113   }
114 
115   @NonNull
116   @Override
put(@onNull DocumentProto document)117   public PutResultProto put(@NonNull DocumentProto document) {
118     return IcingSearchEngineUtils.byteArrayToPutResultProto(
119         icingSearchEngineImpl.put(document.toByteArray()));
120   }
121 
122   @NonNull
123   @Override
get( @onNull String namespace, @NonNull String uri, @NonNull GetResultSpecProto getResultSpec)124   public GetResultProto get(
125       @NonNull String namespace, @NonNull String uri, @NonNull GetResultSpecProto getResultSpec) {
126     return IcingSearchEngineUtils.byteArrayToGetResultProto(
127         icingSearchEngineImpl.get(namespace, uri, getResultSpec.toByteArray()));
128   }
129 
130   @NonNull
131   @Override
reportUsage(@onNull UsageReport usageReport)132   public ReportUsageResultProto reportUsage(@NonNull UsageReport usageReport) {
133     return IcingSearchEngineUtils.byteArrayToReportUsageResultProto(
134         icingSearchEngineImpl.reportUsage(usageReport.toByteArray()));
135   }
136 
137   @NonNull
138   @Override
getAllNamespaces()139   public GetAllNamespacesResultProto getAllNamespaces() {
140     return IcingSearchEngineUtils.byteArrayToGetAllNamespacesResultProto(
141         icingSearchEngineImpl.getAllNamespaces());
142   }
143 
144   @NonNull
145   @Override
search( @onNull SearchSpecProto searchSpec, @NonNull ScoringSpecProto scoringSpec, @NonNull ResultSpecProto resultSpec)146   public SearchResultProto search(
147       @NonNull SearchSpecProto searchSpec,
148       @NonNull ScoringSpecProto scoringSpec,
149       @NonNull ResultSpecProto resultSpec) {
150     return IcingSearchEngineUtils.byteArrayToSearchResultProto(
151         icingSearchEngineImpl.search(
152             searchSpec.toByteArray(), scoringSpec.toByteArray(), resultSpec.toByteArray()));
153   }
154 
155   @NonNull
156   @Override
getNextPage(long nextPageToken)157   public SearchResultProto getNextPage(long nextPageToken) {
158     return IcingSearchEngineUtils.byteArrayToSearchResultProto(
159         icingSearchEngineImpl.getNextPage(nextPageToken));
160   }
161 
162   @NonNull
163   @Override
invalidateNextPageToken(long nextPageToken)164   public void invalidateNextPageToken(long nextPageToken) {
165     icingSearchEngineImpl.invalidateNextPageToken(nextPageToken);
166   }
167 
168   @NonNull
169   @Override
delete(@onNull String namespace, @NonNull String uri)170   public DeleteResultProto delete(@NonNull String namespace, @NonNull String uri) {
171     return IcingSearchEngineUtils.byteArrayToDeleteResultProto(
172         icingSearchEngineImpl.delete(namespace, uri));
173   }
174 
175   @NonNull
176   @Override
searchSuggestions(@onNull SuggestionSpecProto suggestionSpec)177   public SuggestionResponse searchSuggestions(@NonNull SuggestionSpecProto suggestionSpec) {
178     return IcingSearchEngineUtils.byteArrayToSuggestionResponse(
179         icingSearchEngineImpl.searchSuggestions(suggestionSpec.toByteArray()));
180   }
181 
182   @NonNull
183   @Override
deleteByNamespace(@onNull String namespace)184   public DeleteByNamespaceResultProto deleteByNamespace(@NonNull String namespace) {
185     return IcingSearchEngineUtils.byteArrayToDeleteByNamespaceResultProto(
186         icingSearchEngineImpl.deleteByNamespace(namespace));
187   }
188 
189   @NonNull
190   @Override
deleteBySchemaType(@onNull String schemaType)191   public DeleteBySchemaTypeResultProto deleteBySchemaType(@NonNull String schemaType) {
192     return IcingSearchEngineUtils.byteArrayToDeleteBySchemaTypeResultProto(
193         icingSearchEngineImpl.deleteBySchemaType(schemaType));
194   }
195 
196   @NonNull
197   @Override
deleteByQuery(@onNull SearchSpecProto searchSpec)198   public DeleteByQueryResultProto deleteByQuery(@NonNull SearchSpecProto searchSpec) {
199     return deleteByQuery(searchSpec, /*returnDeletedDocumentInfo=*/ false);
200   }
201 
202   @NonNull
203   @Override
deleteByQuery( @onNull SearchSpecProto searchSpec, boolean returnDeletedDocumentInfo)204   public DeleteByQueryResultProto deleteByQuery(
205       @NonNull SearchSpecProto searchSpec, boolean returnDeletedDocumentInfo) {
206     return IcingSearchEngineUtils.byteArrayToDeleteByQueryResultProto(
207         icingSearchEngineImpl.deleteByQuery(searchSpec.toByteArray(), returnDeletedDocumentInfo));
208   }
209 
210   @NonNull
211   @Override
persistToDisk(@onNull PersistType.Code persistTypeCode)212   public PersistToDiskResultProto persistToDisk(@NonNull PersistType.Code persistTypeCode) {
213     return IcingSearchEngineUtils.byteArrayToPersistToDiskResultProto(
214         icingSearchEngineImpl.persistToDisk(persistTypeCode.getNumber()));
215   }
216 
217   @NonNull
218   @Override
optimize()219   public OptimizeResultProto optimize() {
220     return IcingSearchEngineUtils.byteArrayToOptimizeResultProto(icingSearchEngineImpl.optimize());
221   }
222 
223   @NonNull
224   @Override
getOptimizeInfo()225   public GetOptimizeInfoResultProto getOptimizeInfo() {
226     return IcingSearchEngineUtils.byteArrayToGetOptimizeInfoResultProto(
227         icingSearchEngineImpl.getOptimizeInfo());
228   }
229 
230   @NonNull
231   @Override
getStorageInfo()232   public StorageInfoResultProto getStorageInfo() {
233     return IcingSearchEngineUtils.byteArrayToStorageInfoResultProto(
234         icingSearchEngineImpl.getStorageInfo());
235   }
236 
237   @NonNull
238   @Override
getDebugInfo(DebugInfoVerbosity.Code verbosity)239   public DebugInfoResultProto getDebugInfo(DebugInfoVerbosity.Code verbosity) {
240     return IcingSearchEngineUtils.byteArrayToDebugInfoResultProto(
241         icingSearchEngineImpl.getDebugInfo(verbosity.getNumber()));
242   }
243 
244   @NonNull
245   @Override
reset()246   public ResetResultProto reset() {
247     return IcingSearchEngineUtils.byteArrayToResetResultProto(icingSearchEngineImpl.reset());
248   }
249 
shouldLog(LogSeverity.Code severity)250   public static boolean shouldLog(LogSeverity.Code severity) {
251     return shouldLog(severity, (short) 0);
252   }
253 
shouldLog(LogSeverity.Code severity, short verbosity)254   public static boolean shouldLog(LogSeverity.Code severity, short verbosity) {
255     return IcingSearchEngineImpl.shouldLog((short) severity.getNumber(), verbosity);
256   }
257 
setLoggingLevel(LogSeverity.Code severity)258   public static boolean setLoggingLevel(LogSeverity.Code severity) {
259     return setLoggingLevel(severity, (short) 0);
260   }
261 
setLoggingLevel(LogSeverity.Code severity, short verbosity)262   public static boolean setLoggingLevel(LogSeverity.Code severity, short verbosity) {
263     return IcingSearchEngineImpl.setLoggingLevel((short) severity.getNumber(), verbosity);
264   }
265 
266   @Nullable
getLoggingTag()267   public static String getLoggingTag() {
268     return IcingSearchEngineImpl.getLoggingTag();
269   }
270 }
271