aboutsummaryrefslogtreecommitdiff
path: root/java/src/com/google/android/icing/IcingSearchEngine.java
blob: 79fcdb8b0df99cc3fef0e05e95746f6699ae4936 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
// Copyright (C) 2019 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package com.google.android.icing;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.google.android.icing.proto.DebugInfoResultProto;
import com.google.android.icing.proto.DebugInfoVerbosity;
import com.google.android.icing.proto.DeleteByNamespaceResultProto;
import com.google.android.icing.proto.DeleteByQueryResultProto;
import com.google.android.icing.proto.DeleteBySchemaTypeResultProto;
import com.google.android.icing.proto.DeleteResultProto;
import com.google.android.icing.proto.DocumentProto;
import com.google.android.icing.proto.GetAllNamespacesResultProto;
import com.google.android.icing.proto.GetOptimizeInfoResultProto;
import com.google.android.icing.proto.GetResultProto;
import com.google.android.icing.proto.GetResultSpecProto;
import com.google.android.icing.proto.GetSchemaResultProto;
import com.google.android.icing.proto.GetSchemaTypeResultProto;
import com.google.android.icing.proto.IcingSearchEngineOptions;
import com.google.android.icing.proto.InitializeResultProto;
import com.google.android.icing.proto.LogSeverity;
import com.google.android.icing.proto.OptimizeResultProto;
import com.google.android.icing.proto.PersistToDiskResultProto;
import com.google.android.icing.proto.PersistType;
import com.google.android.icing.proto.PutResultProto;
import com.google.android.icing.proto.ReportUsageResultProto;
import com.google.android.icing.proto.ResetResultProto;
import com.google.android.icing.proto.ResultSpecProto;
import com.google.android.icing.proto.SchemaProto;
import com.google.android.icing.proto.ScoringSpecProto;
import com.google.android.icing.proto.SearchResultProto;
import com.google.android.icing.proto.SearchSpecProto;
import com.google.android.icing.proto.SetSchemaResultProto;
import com.google.android.icing.proto.StorageInfoResultProto;
import com.google.android.icing.proto.SuggestionResponse;
import com.google.android.icing.proto.SuggestionSpecProto;
import com.google.android.icing.proto.UsageReport;

/**
 * Java wrapper to access {@link IcingSearchEngineImpl}.
 *
 * <p>It converts byte array from {@link IcingSearchEngineImpl} to corresponding protos.
 *
 * <p>If this instance has been closed, the instance is no longer usable.
 *
 * <p>Keep this class to be non-Final so that it can be mocked in AppSearch.
 *
 * <p>NOTE: This class is NOT thread-safe.
 */
public class IcingSearchEngine implements IcingSearchEngineInterface {

  private static final String TAG = "IcingSearchEngine";
  private final IcingSearchEngineImpl icingSearchEngineImpl;

  /**
   * @throws IllegalStateException if IcingSearchEngine fails to be created
   */
  public IcingSearchEngine(@NonNull IcingSearchEngineOptions options) {
    icingSearchEngineImpl = new IcingSearchEngineImpl(options.toByteArray());
  }

  @Override
  public void close() {
    icingSearchEngineImpl.close();
  }

  @SuppressWarnings("deprecation")
  @Override
  protected void finalize() throws Throwable {
    icingSearchEngineImpl.close();
    super.finalize();
  }

  @NonNull
  @Override
  public InitializeResultProto initialize() {
    return IcingSearchEngineUtils.byteArrayToInitializeResultProto(
        icingSearchEngineImpl.initialize());
  }

  @NonNull
  @Override
  public SetSchemaResultProto setSchema(@NonNull SchemaProto schema) {
    return setSchema(schema, /*ignoreErrorsAndDeleteDocuments=*/ false);
  }

  @NonNull
  @Override
  public SetSchemaResultProto setSchema(
      @NonNull SchemaProto schema, boolean ignoreErrorsAndDeleteDocuments) {
    return IcingSearchEngineUtils.byteArrayToSetSchemaResultProto(
        icingSearchEngineImpl.setSchema(schema.toByteArray(), ignoreErrorsAndDeleteDocuments));
  }

  @NonNull
  @Override
  public GetSchemaResultProto getSchema() {
    return IcingSearchEngineUtils.byteArrayToGetSchemaResultProto(
        icingSearchEngineImpl.getSchema());
  }

  @NonNull
  @Override
  public GetSchemaTypeResultProto getSchemaType(@NonNull String schemaType) {
    return IcingSearchEngineUtils.byteArrayToGetSchemaTypeResultProto(
        icingSearchEngineImpl.getSchemaType(schemaType));
  }

  @NonNull
  @Override
  public PutResultProto put(@NonNull DocumentProto document) {
    return IcingSearchEngineUtils.byteArrayToPutResultProto(
        icingSearchEngineImpl.put(document.toByteArray()));
  }

  @NonNull
  @Override
  public GetResultProto get(
      @NonNull String namespace, @NonNull String uri, @NonNull GetResultSpecProto getResultSpec) {
    return IcingSearchEngineUtils.byteArrayToGetResultProto(
        icingSearchEngineImpl.get(namespace, uri, getResultSpec.toByteArray()));
  }

  @NonNull
  @Override
  public ReportUsageResultProto reportUsage(@NonNull UsageReport usageReport) {
    return IcingSearchEngineUtils.byteArrayToReportUsageResultProto(
        icingSearchEngineImpl.reportUsage(usageReport.toByteArray()));
  }

  @NonNull
  @Override
  public GetAllNamespacesResultProto getAllNamespaces() {
    return IcingSearchEngineUtils.byteArrayToGetAllNamespacesResultProto(
        icingSearchEngineImpl.getAllNamespaces());
  }

  @NonNull
  @Override
  public SearchResultProto search(
      @NonNull SearchSpecProto searchSpec,
      @NonNull ScoringSpecProto scoringSpec,
      @NonNull ResultSpecProto resultSpec) {
    return IcingSearchEngineUtils.byteArrayToSearchResultProto(
        icingSearchEngineImpl.search(
            searchSpec.toByteArray(), scoringSpec.toByteArray(), resultSpec.toByteArray()));
  }

  @NonNull
  @Override
  public SearchResultProto getNextPage(long nextPageToken) {
    return IcingSearchEngineUtils.byteArrayToSearchResultProto(
        icingSearchEngineImpl.getNextPage(nextPageToken));
  }

  @NonNull
  @Override
  public void invalidateNextPageToken(long nextPageToken) {
    icingSearchEngineImpl.invalidateNextPageToken(nextPageToken);
  }

  @NonNull
  @Override
  public DeleteResultProto delete(@NonNull String namespace, @NonNull String uri) {
    return IcingSearchEngineUtils.byteArrayToDeleteResultProto(
        icingSearchEngineImpl.delete(namespace, uri));
  }

  @NonNull
  @Override
  public SuggestionResponse searchSuggestions(@NonNull SuggestionSpecProto suggestionSpec) {
    return IcingSearchEngineUtils.byteArrayToSuggestionResponse(
        icingSearchEngineImpl.searchSuggestions(suggestionSpec.toByteArray()));
  }

  @NonNull
  @Override
  public DeleteByNamespaceResultProto deleteByNamespace(@NonNull String namespace) {
    return IcingSearchEngineUtils.byteArrayToDeleteByNamespaceResultProto(
        icingSearchEngineImpl.deleteByNamespace(namespace));
  }

  @NonNull
  @Override
  public DeleteBySchemaTypeResultProto deleteBySchemaType(@NonNull String schemaType) {
    return IcingSearchEngineUtils.byteArrayToDeleteBySchemaTypeResultProto(
        icingSearchEngineImpl.deleteBySchemaType(schemaType));
  }

  @NonNull
  @Override
  public DeleteByQueryResultProto deleteByQuery(@NonNull SearchSpecProto searchSpec) {
    return deleteByQuery(searchSpec, /*returnDeletedDocumentInfo=*/ false);
  }

  @NonNull
  @Override
  public DeleteByQueryResultProto deleteByQuery(
      @NonNull SearchSpecProto searchSpec, boolean returnDeletedDocumentInfo) {
    return IcingSearchEngineUtils.byteArrayToDeleteByQueryResultProto(
        icingSearchEngineImpl.deleteByQuery(searchSpec.toByteArray(), returnDeletedDocumentInfo));
  }

  @NonNull
  @Override
  public PersistToDiskResultProto persistToDisk(@NonNull PersistType.Code persistTypeCode) {
    return IcingSearchEngineUtils.byteArrayToPersistToDiskResultProto(
        icingSearchEngineImpl.persistToDisk(persistTypeCode.getNumber()));
  }

  @NonNull
  @Override
  public OptimizeResultProto optimize() {
    return IcingSearchEngineUtils.byteArrayToOptimizeResultProto(icingSearchEngineImpl.optimize());
  }

  @NonNull
  @Override
  public GetOptimizeInfoResultProto getOptimizeInfo() {
    return IcingSearchEngineUtils.byteArrayToGetOptimizeInfoResultProto(
        icingSearchEngineImpl.getOptimizeInfo());
  }

  @NonNull
  @Override
  public StorageInfoResultProto getStorageInfo() {
    return IcingSearchEngineUtils.byteArrayToStorageInfoResultProto(
        icingSearchEngineImpl.getStorageInfo());
  }

  @NonNull
  @Override
  public DebugInfoResultProto getDebugInfo(DebugInfoVerbosity.Code verbosity) {
    return IcingSearchEngineUtils.byteArrayToDebugInfoResultProto(
        icingSearchEngineImpl.getDebugInfo(verbosity.getNumber()));
  }

  @NonNull
  @Override
  public ResetResultProto reset() {
    return IcingSearchEngineUtils.byteArrayToResetResultProto(icingSearchEngineImpl.reset());
  }

  public static boolean shouldLog(LogSeverity.Code severity) {
    return shouldLog(severity, (short) 0);
  }

  public static boolean shouldLog(LogSeverity.Code severity, short verbosity) {
    return IcingSearchEngineImpl.shouldLog((short) severity.getNumber(), verbosity);
  }

  public static boolean setLoggingLevel(LogSeverity.Code severity) {
    return setLoggingLevel(severity, (short) 0);
  }

  public static boolean setLoggingLevel(LogSeverity.Code severity, short verbosity) {
    return IcingSearchEngineImpl.setLoggingLevel((short) severity.getNumber(), verbosity);
  }

  @Nullable
  public static String getLoggingTag() {
    return IcingSearchEngineImpl.getLoggingTag();
  }
}