diff options
Diffstat (limited to 'java/src/com/google/android/icing')
-rw-r--r-- | java/src/com/google/android/icing/BreakIteratorBatcher.java | 11 | ||||
-rw-r--r-- | java/src/com/google/android/icing/IcingSearchEngine.java | 220 |
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); } |