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