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