aboutsummaryrefslogtreecommitdiff
path: root/java/src/com/google/android/icing
diff options
context:
space:
mode:
Diffstat (limited to 'java/src/com/google/android/icing')
-rw-r--r--java/src/com/google/android/icing/BreakIteratorBatcher.java11
-rw-r--r--java/src/com/google/android/icing/IcingSearchEngine.java220
2 files changed, 164 insertions, 67 deletions
diff --git a/java/src/com/google/android/icing/BreakIteratorBatcher.java b/java/src/com/google/android/icing/BreakIteratorBatcher.java
index 58efbfc..2b87327 100644
--- a/java/src/com/google/android/icing/BreakIteratorBatcher.java
+++ b/java/src/com/google/android/icing/BreakIteratorBatcher.java
@@ -14,9 +14,6 @@
package com.google.android.icing;
-import androidx.annotation.NonNull;
-import androidx.annotation.RestrictTo;
-
import java.text.BreakIterator;
import java.util.ArrayList;
import java.util.List;
@@ -38,20 +35,17 @@ import java.util.Locale;
* utf16Boundaries = brkItrBatcher.next(5);
* assertThat(utf16Boundaries).asList().containsExactly(9);
* }</pre>
- *
- * @hide
*/
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
public class BreakIteratorBatcher {
private final BreakIterator iterator;
- public BreakIteratorBatcher(@NonNull Locale locale) {
+ public BreakIteratorBatcher(Locale locale) {
this.iterator = BreakIterator.getWordInstance(locale);
}
/* Direct calls to BreakIterator */
- public void setText(@NonNull String text) {
+ public void setText(String text) {
iterator.setText(text);
}
@@ -73,7 +67,6 @@ public class BreakIteratorBatcher {
* the end of the text (returns BreakIterator#DONE), then only the results of the previous calls
* in that batch will be returned.
*/
- @NonNull
public int[] next(int batchSize) {
List<Integer> breakIndices = new ArrayList<>(batchSize);
for (int i = 0; i < batchSize; ++i) {
diff --git a/java/src/com/google/android/icing/IcingSearchEngine.java b/java/src/com/google/android/icing/IcingSearchEngine.java
index cac9fcd..1f5fb51 100644
--- a/java/src/com/google/android/icing/IcingSearchEngine.java
+++ b/java/src/com/google/android/icing/IcingSearchEngine.java
@@ -17,18 +17,21 @@ package com.google.android.icing;
import android.util.Log;
import androidx.annotation.NonNull;
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.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;
@@ -39,12 +42,22 @@ 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.StatusProto;
+import com.google.android.icing.proto.StorageInfoResultProto;
import com.google.android.icing.proto.UsageReport;
import com.google.protobuf.ExtensionRegistryLite;
import com.google.protobuf.InvalidProtocolBufferException;
-
-/** Java wrapper to access native APIs in external/icing/icing/icing-search-engine.h */
-public final class IcingSearchEngine {
+import java.io.Closeable;
+
+/**
+ * Java wrapper to access native APIs in external/icing/icing/icing-search-engine.h
+ *
+ * <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 Closeable {
private static final String TAG = "IcingSearchEngine";
private static final ExtensionRegistryLite EXTENSION_REGISTRY_LITE =
@@ -52,6 +65,8 @@ public final class IcingSearchEngine {
private long nativePointer;
+ private boolean closed = false;
+
static {
// NOTE: This can fail with an UnsatisfiedLinkError
System.loadLibrary("icing");
@@ -66,9 +81,36 @@ public final class IcingSearchEngine {
}
}
+ private void throwIfClosed() {
+ if (closed) {
+ throw new IllegalStateException("Trying to use a closed IcingSearchEngine instance.");
+ }
+ }
+
+ @Override
+ public void close() {
+ if (closed) {
+ return;
+ }
+
+ if (nativePointer != 0) {
+ nativeDestroy(this);
+ }
+ nativePointer = 0;
+ closed = true;
+ }
+
+ @Override
+ protected void finalize() throws Throwable {
+ close();
+ super.finalize();
+ }
+
@NonNull
public InitializeResultProto initialize() {
- byte[] initializeResultBytes = nativeInitialize(nativePointer);
+ throwIfClosed();
+
+ byte[] initializeResultBytes = nativeInitialize(this);
if (initializeResultBytes == null) {
Log.e(TAG, "Received null InitializeResult from native.");
return InitializeResultProto.newBuilder()
@@ -94,8 +136,10 @@ public final class IcingSearchEngine {
@NonNull
public SetSchemaResultProto setSchema(
@NonNull SchemaProto schema, boolean ignoreErrorsAndDeleteDocuments) {
+ throwIfClosed();
+
byte[] setSchemaResultBytes =
- nativeSetSchema(nativePointer, schema.toByteArray(), ignoreErrorsAndDeleteDocuments);
+ nativeSetSchema(this, schema.toByteArray(), ignoreErrorsAndDeleteDocuments);
if (setSchemaResultBytes == null) {
Log.e(TAG, "Received null SetSchemaResultProto from native.");
return SetSchemaResultProto.newBuilder()
@@ -115,7 +159,9 @@ public final class IcingSearchEngine {
@NonNull
public GetSchemaResultProto getSchema() {
- byte[] getSchemaResultBytes = nativeGetSchema(nativePointer);
+ throwIfClosed();
+
+ byte[] getSchemaResultBytes = nativeGetSchema(this);
if (getSchemaResultBytes == null) {
Log.e(TAG, "Received null GetSchemaResultProto from native.");
return GetSchemaResultProto.newBuilder()
@@ -135,7 +181,9 @@ public final class IcingSearchEngine {
@NonNull
public GetSchemaTypeResultProto getSchemaType(@NonNull String schemaType) {
- byte[] getSchemaTypeResultBytes = nativeGetSchemaType(nativePointer, schemaType);
+ throwIfClosed();
+
+ byte[] getSchemaTypeResultBytes = nativeGetSchemaType(this, schemaType);
if (getSchemaTypeResultBytes == null) {
Log.e(TAG, "Received null GetSchemaTypeResultProto from native.");
return GetSchemaTypeResultProto.newBuilder()
@@ -155,7 +203,9 @@ public final class IcingSearchEngine {
@NonNull
public PutResultProto put(@NonNull DocumentProto document) {
- byte[] putResultBytes = nativePut(nativePointer, document.toByteArray());
+ throwIfClosed();
+
+ byte[] putResultBytes = nativePut(this, document.toByteArray());
if (putResultBytes == null) {
Log.e(TAG, "Received null PutResultProto from native.");
return PutResultProto.newBuilder()
@@ -174,8 +224,11 @@ public final class IcingSearchEngine {
}
@NonNull
- public GetResultProto get(@NonNull String namespace, @NonNull String uri) {
- byte[] getResultBytes = nativeGet(nativePointer, namespace, uri);
+ public GetResultProto get(
+ @NonNull String namespace, @NonNull String uri, @NonNull GetResultSpecProto getResultSpec) {
+ throwIfClosed();
+
+ byte[] getResultBytes = nativeGet(this, namespace, uri, getResultSpec.toByteArray());
if (getResultBytes == null) {
Log.e(TAG, "Received null GetResultProto from native.");
return GetResultProto.newBuilder()
@@ -195,7 +248,9 @@ public final class IcingSearchEngine {
@NonNull
public ReportUsageResultProto reportUsage(@NonNull UsageReport usageReport) {
- byte[] reportUsageResultBytes = nativeReportUsage(nativePointer, usageReport.toByteArray());
+ throwIfClosed();
+
+ byte[] reportUsageResultBytes = nativeReportUsage(this, usageReport.toByteArray());
if (reportUsageResultBytes == null) {
Log.e(TAG, "Received null ReportUsageResultProto from native.");
return ReportUsageResultProto.newBuilder()
@@ -215,7 +270,9 @@ public final class IcingSearchEngine {
@NonNull
public GetAllNamespacesResultProto getAllNamespaces() {
- byte[] getAllNamespacesResultBytes = nativeGetAllNamespaces(nativePointer);
+ throwIfClosed();
+
+ byte[] getAllNamespacesResultBytes = nativeGetAllNamespaces(this);
if (getAllNamespacesResultBytes == null) {
Log.e(TAG, "Received null GetAllNamespacesResultProto from native.");
return GetAllNamespacesResultProto.newBuilder()
@@ -239,12 +296,11 @@ public final class IcingSearchEngine {
@NonNull SearchSpecProto searchSpec,
@NonNull ScoringSpecProto scoringSpec,
@NonNull ResultSpecProto resultSpec) {
+ throwIfClosed();
+
byte[] searchResultBytes =
nativeSearch(
- nativePointer,
- searchSpec.toByteArray(),
- scoringSpec.toByteArray(),
- resultSpec.toByteArray());
+ this, searchSpec.toByteArray(), scoringSpec.toByteArray(), resultSpec.toByteArray());
if (searchResultBytes == null) {
Log.e(TAG, "Received null SearchResultProto from native.");
return SearchResultProto.newBuilder()
@@ -264,7 +320,9 @@ public final class IcingSearchEngine {
@NonNull
public SearchResultProto getNextPage(long nextPageToken) {
- byte[] searchResultBytes = nativeGetNextPage(nativePointer, nextPageToken);
+ throwIfClosed();
+
+ byte[] searchResultBytes = nativeGetNextPage(this, nextPageToken);
if (searchResultBytes == null) {
Log.e(TAG, "Received null SearchResultProto from native.");
return SearchResultProto.newBuilder()
@@ -284,12 +342,16 @@ public final class IcingSearchEngine {
@NonNull
public void invalidateNextPageToken(long nextPageToken) {
- nativeInvalidateNextPageToken(nativePointer, nextPageToken);
+ throwIfClosed();
+
+ nativeInvalidateNextPageToken(this, nextPageToken);
}
@NonNull
public DeleteResultProto delete(@NonNull String namespace, @NonNull String uri) {
- byte[] deleteResultBytes = nativeDelete(nativePointer, namespace, uri);
+ throwIfClosed();
+
+ byte[] deleteResultBytes = nativeDelete(this, namespace, uri);
if (deleteResultBytes == null) {
Log.e(TAG, "Received null DeleteResultProto from native.");
return DeleteResultProto.newBuilder()
@@ -309,7 +371,9 @@ public final class IcingSearchEngine {
@NonNull
public DeleteByNamespaceResultProto deleteByNamespace(@NonNull String namespace) {
- byte[] deleteByNamespaceResultBytes = nativeDeleteByNamespace(nativePointer, namespace);
+ throwIfClosed();
+
+ byte[] deleteByNamespaceResultBytes = nativeDeleteByNamespace(this, namespace);
if (deleteByNamespaceResultBytes == null) {
Log.e(TAG, "Received null DeleteByNamespaceResultProto from native.");
return DeleteByNamespaceResultProto.newBuilder()
@@ -330,7 +394,9 @@ public final class IcingSearchEngine {
@NonNull
public DeleteBySchemaTypeResultProto deleteBySchemaType(@NonNull String schemaType) {
- byte[] deleteBySchemaTypeResultBytes = nativeDeleteBySchemaType(nativePointer, schemaType);
+ throwIfClosed();
+
+ byte[] deleteBySchemaTypeResultBytes = nativeDeleteBySchemaType(this, schemaType);
if (deleteBySchemaTypeResultBytes == null) {
Log.e(TAG, "Received null DeleteBySchemaTypeResultProto from native.");
return DeleteBySchemaTypeResultProto.newBuilder()
@@ -350,28 +416,32 @@ public final class IcingSearchEngine {
}
@NonNull
- public DeleteResultProto deleteByQuery(@NonNull SearchSpecProto searchSpec) {
- byte[] deleteResultBytes = nativeDeleteByQuery(nativePointer, searchSpec.toByteArray());
+ public DeleteByQueryResultProto deleteByQuery(@NonNull SearchSpecProto searchSpec) {
+ throwIfClosed();
+
+ byte[] deleteResultBytes = nativeDeleteByQuery(this, searchSpec.toByteArray());
if (deleteResultBytes == null) {
Log.e(TAG, "Received null DeleteResultProto from native.");
- return DeleteResultProto.newBuilder()
+ return DeleteByQueryResultProto.newBuilder()
.setStatus(StatusProto.newBuilder().setCode(StatusProto.Code.INTERNAL))
.build();
}
try {
- return DeleteResultProto.parseFrom(deleteResultBytes, EXTENSION_REGISTRY_LITE);
+ return DeleteByQueryResultProto.parseFrom(deleteResultBytes, EXTENSION_REGISTRY_LITE);
} catch (InvalidProtocolBufferException e) {
Log.e(TAG, "Error parsing DeleteResultProto.", e);
- return DeleteResultProto.newBuilder()
+ return DeleteByQueryResultProto.newBuilder()
.setStatus(StatusProto.newBuilder().setCode(StatusProto.Code.INTERNAL))
.build();
}
}
@NonNull
- public PersistToDiskResultProto persistToDisk() {
- byte[] persistToDiskResultBytes = nativePersistToDisk(nativePointer);
+ public PersistToDiskResultProto persistToDisk(@NonNull PersistType.Code persistTypeCode) {
+ throwIfClosed();
+
+ byte[] persistToDiskResultBytes = nativePersistToDisk(this, persistTypeCode.getNumber());
if (persistToDiskResultBytes == null) {
Log.e(TAG, "Received null PersistToDiskResultProto from native.");
return PersistToDiskResultProto.newBuilder()
@@ -391,7 +461,9 @@ public final class IcingSearchEngine {
@NonNull
public OptimizeResultProto optimize() {
- byte[] optimizeResultBytes = nativeOptimize(nativePointer);
+ throwIfClosed();
+
+ byte[] optimizeResultBytes = nativeOptimize(this);
if (optimizeResultBytes == null) {
Log.e(TAG, "Received null OptimizeResultProto from native.");
return OptimizeResultProto.newBuilder()
@@ -411,7 +483,9 @@ public final class IcingSearchEngine {
@NonNull
public GetOptimizeInfoResultProto getOptimizeInfo() {
- byte[] getOptimizeInfoResultBytes = nativeGetOptimizeInfo(nativePointer);
+ throwIfClosed();
+
+ byte[] getOptimizeInfoResultBytes = nativeGetOptimizeInfo(this);
if (getOptimizeInfoResultBytes == null) {
Log.e(TAG, "Received null GetOptimizeInfoResultProto from native.");
return GetOptimizeInfoResultProto.newBuilder()
@@ -431,8 +505,33 @@ public final class IcingSearchEngine {
}
@NonNull
+ public StorageInfoResultProto getStorageInfo() {
+ throwIfClosed();
+
+ byte[] storageInfoResultProtoBytes = nativeGetStorageInfo(this);
+ if (storageInfoResultProtoBytes == null) {
+ Log.e(TAG, "Received null StorageInfoResultProto from native.");
+ return StorageInfoResultProto.newBuilder()
+ .setStatus(StatusProto.newBuilder().setCode(StatusProto.Code.INTERNAL))
+ .build();
+ }
+
+ try {
+ return StorageInfoResultProto.parseFrom(
+ storageInfoResultProtoBytes, EXTENSION_REGISTRY_LITE);
+ } catch (InvalidProtocolBufferException e) {
+ Log.e(TAG, "Error parsing GetOptimizeInfoResultProto.", e);
+ return StorageInfoResultProto.newBuilder()
+ .setStatus(StatusProto.newBuilder().setCode(StatusProto.Code.INTERNAL))
+ .build();
+ }
+ }
+
+ @NonNull
public ResetResultProto reset() {
- byte[] resetResultBytes = nativeReset(nativePointer);
+ throwIfClosed();
+
+ byte[] resetResultBytes = nativeReset(this);
if (resetResultBytes == null) {
Log.e(TAG, "Received null ResetResultProto from native.");
return ResetResultProto.newBuilder()
@@ -450,54 +549,59 @@ public final class IcingSearchEngine {
}
}
- public void destroy() {
- if (nativePointer != 0) {
- nativeDestroy(nativePointer);
- }
- nativePointer = 0;
- }
-
private static native long nativeCreate(byte[] icingSearchEngineOptionsBytes);
- private static native void nativeDestroy(long nativePointer);
+ private static native void nativeDestroy(IcingSearchEngine instance);
- private static native byte[] nativeInitialize(long nativePointer);
+ private static native byte[] nativeInitialize(IcingSearchEngine instance);
private static native byte[] nativeSetSchema(
- long nativePointer, byte[] schemaBytes, boolean ignoreErrorsAndDeleteDocuments);
+ IcingSearchEngine instance, byte[] schemaBytes, boolean ignoreErrorsAndDeleteDocuments);
- private static native byte[] nativeGetSchema(long nativePointer);
+ private static native byte[] nativeGetSchema(IcingSearchEngine instance);
- private static native byte[] nativeGetSchemaType(long nativePointer, String schemaType);
+ private static native byte[] nativeGetSchemaType(IcingSearchEngine instance, String schemaType);
- private static native byte[] nativePut(long nativePointer, byte[] documentBytes);
+ private static native byte[] nativePut(IcingSearchEngine instance, byte[] documentBytes);
- private static native byte[] nativeGet(long nativePointer, String namespace, String uri);
+ private static native byte[] nativeGet(
+ IcingSearchEngine instance, String namespace, String uri, byte[] getResultSpecBytes);
- private static native byte[] nativeReportUsage(long nativePointer, byte[] usageReportBytes);
+ private static native byte[] nativeReportUsage(
+ IcingSearchEngine instance, byte[] usageReportBytes);
- private static native byte[] nativeGetAllNamespaces(long nativePointer);
+ private static native byte[] nativeGetAllNamespaces(IcingSearchEngine instance);
private static native byte[] nativeSearch(
- long nativePointer, byte[] searchSpecBytes, byte[] scoringSpecBytes, byte[] resultSpecBytes);
+ IcingSearchEngine instance,
+ byte[] searchSpecBytes,
+ byte[] scoringSpecBytes,
+ byte[] resultSpecBytes);
+
+ private static native byte[] nativeGetNextPage(IcingSearchEngine instance, long nextPageToken);
- private static native byte[] nativeGetNextPage(long nativePointer, long nextPageToken);
+ private static native void nativeInvalidateNextPageToken(
+ IcingSearchEngine instance, long nextPageToken);
- private static native void nativeInvalidateNextPageToken(long nativePointer, long nextPageToken);
+ private static native byte[] nativeDelete(
+ IcingSearchEngine instance, String namespace, String uri);
- private static native byte[] nativeDelete(long nativePointer, String namespace, String uri);
+ private static native byte[] nativeDeleteByNamespace(
+ IcingSearchEngine instance, String namespace);
- private static native byte[] nativeDeleteByNamespace(long nativePointer, String namespace);
+ private static native byte[] nativeDeleteBySchemaType(
+ IcingSearchEngine instance, String schemaType);
- private static native byte[] nativeDeleteBySchemaType(long nativePointer, String schemaType);
+ private static native byte[] nativeDeleteByQuery(
+ IcingSearchEngine instance, byte[] searchSpecBytes);
- private static native byte[] nativeDeleteByQuery(long nativePointer, byte[] searchSpecBytes);
+ private static native byte[] nativePersistToDisk(IcingSearchEngine instance, int persistType);
- private static native byte[] nativePersistToDisk(long nativePointer);
+ private static native byte[] nativeOptimize(IcingSearchEngine instance);
- private static native byte[] nativeOptimize(long nativePointer);
+ private static native byte[] nativeGetOptimizeInfo(IcingSearchEngine instance);
- private static native byte[] nativeGetOptimizeInfo(long nativePointer);
+ private static native byte[] nativeGetStorageInfo(IcingSearchEngine instance);
- private static native byte[] nativeReset(long nativePointer);
+ private static native byte[] nativeReset(IcingSearchEngine instance);
}