diff options
author | Terry Wang <tytytyww@google.com> | 2020-07-28 16:32:46 -0700 |
---|---|---|
committer | Terry Wang <tytytyww@google.com> | 2020-07-28 16:32:46 -0700 |
commit | 9e9c7171c44842a7251872f23a9d824f0553ce93 (patch) | |
tree | 20ac2dacc85345fdf9bceee096143e0bbffaf710 /java | |
parent | dd9a0fa36f5a982ccb2ac30108ed067479d73b85 (diff) | |
parent | 9f1b9cf4dc93fa7bfee0a3637c93dc5b557aab30 (diff) | |
download | icing-9e9c7171c44842a7251872f23a9d824f0553ce93.tar.gz |
Merge remote-tracking branch 'aosp/upstream-master' into androidx-master-dev
* aosp/upstream-master:
Pull upstream changes.
Change-Id: I2b23aaf8859b5c0b201a69ae3cbcaa6acd49c6bd
Diffstat (limited to 'java')
-rw-r--r-- | java/src/com/google/android/icing/IcingSearchEngine.java | 29 | ||||
-rw-r--r-- | java/tests/instrumentation/src/com/google/android/icing/IcingSearchEngineTest.java | 59 |
2 files changed, 88 insertions, 0 deletions
diff --git a/java/src/com/google/android/icing/IcingSearchEngine.java b/java/src/com/google/android/icing/IcingSearchEngine.java index d981d1b..7be631c 100644 --- a/java/src/com/google/android/icing/IcingSearchEngine.java +++ b/java/src/com/google/android/icing/IcingSearchEngine.java @@ -241,6 +241,31 @@ public final class IcingSearchEngine { } @NonNull + public SearchResultProto getNextPage(long nextPageToken) { + byte[] searchResultBytes = nativeGetNextPage(nativePointer, nextPageToken); + if (searchResultBytes == null) { + Log.e(TAG, "Received null SearchResultProto from native."); + return SearchResultProto.newBuilder() + .setStatus(StatusProto.newBuilder().setCode(StatusProto.Code.INTERNAL)) + .build(); + } + + try { + return SearchResultProto.parseFrom(searchResultBytes, EXTENSION_REGISTRY_LITE); + } catch (InvalidProtocolBufferException e) { + Log.e(TAG, "Error parsing SearchResultProto.", e); + return SearchResultProto.newBuilder() + .setStatus(StatusProto.newBuilder().setCode(StatusProto.Code.INTERNAL)) + .build(); + } + } + + @NonNull + public void invalidateNextPageToken(long nextPageToken) { + nativeInvalidateNextPageToken(nativePointer, nextPageToken); + } + + @NonNull public DeleteResultProto delete(@NonNull String namespace, @NonNull String uri) { byte[] deleteResultBytes = nativeDelete(nativePointer, namespace, uri); if (deleteResultBytes == null) { @@ -403,6 +428,10 @@ public final class IcingSearchEngine { private static native byte[] nativeSearch( long nativePointer, byte[] searchSpecBytes, byte[] scoringSpecBytes, byte[] resultSpecBytes); + private static native byte[] nativeGetNextPage(long nativePointer, long nextPageToken); + + private static native void nativeInvalidateNextPageToken(long nativePointer, long nextPageToken); + private static native byte[] nativeDelete(long nativePointer, String namespace, String uri); private static native byte[] nativeDeleteByNamespace(long nativePointer, String namespace); diff --git a/java/tests/instrumentation/src/com/google/android/icing/IcingSearchEngineTest.java b/java/tests/instrumentation/src/com/google/android/icing/IcingSearchEngineTest.java index a01e7db..d907d4e 100644 --- a/java/tests/instrumentation/src/com/google/android/icing/IcingSearchEngineTest.java +++ b/java/tests/instrumentation/src/com/google/android/icing/IcingSearchEngineTest.java @@ -46,6 +46,8 @@ import com.google.android.icing.proto.SetSchemaResultProto; import com.google.android.icing.proto.StatusProto; import com.google.android.icing.proto.TermMatchType; import com.google.android.icing.IcingSearchEngine; +import java.util.HashMap; +import java.util.Map; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -197,6 +199,63 @@ public final class IcingSearchEngineTest { } @Test + public void testGetNextPage() throws Exception { + IcingSearchEngineOptions options = + IcingSearchEngineOptions.newBuilder().setBaseDir(filesDir).build(); + IcingSearchEngine icing = new IcingSearchEngine(options); + assertThat(icing.initialize().getStatus().getCode()).isEqualTo(StatusProto.Code.OK); + + SchemaTypeConfigProto emailTypeConfig = createEmailTypeConfig(); + SchemaProto schema = SchemaProto.newBuilder().addTypes(emailTypeConfig).build(); + assertThat( + icing + .setSchema(schema, /*ignoreErrorsAndDeleteDocuments=*/ false) + .getStatus() + .getCode()) + .isEqualTo(StatusProto.Code.OK); + + Map<String, DocumentProto> documents = new HashMap<>(); + for (int i = 0; i < 10; i++) { + DocumentProto emailDocument = + createEmailDocument("namespace", "uri:" + i).toBuilder() + .addProperties(PropertyProto.newBuilder().setName("subject").addStringValues("foo")) + .build(); + documents.put("uri:" + i, emailDocument); + assertThat(icing.put(emailDocument).getStatus().getCode()).isEqualTo(StatusProto.Code.OK); + } + + SearchSpecProto searchSpec = + SearchSpecProto.newBuilder() + .setQuery("foo") + .setTermMatchType(TermMatchType.Code.PREFIX) + .build(); + ResultSpecProto resultSpecProto = ResultSpecProto.newBuilder().setNumPerPage(1).build(); + + SearchResultProto searchResultProto = + icing.search(searchSpec, ScoringSpecProto.getDefaultInstance(), resultSpecProto); + assertThat(searchResultProto.getStatus().getCode()).isEqualTo(StatusProto.Code.OK); + assertThat(searchResultProto.getResultsCount()).isEqualTo(1); + DocumentProto resultDocument = searchResultProto.getResults(0).getDocument(); + assertThat(resultDocument).isEqualTo(documents.remove(resultDocument.getUri())); + + // fetch rest pages + for (int i = 1; i < 5; i++) { + searchResultProto = icing.getNextPage(searchResultProto.getNextPageToken()); + assertThat(searchResultProto.getStatus().getCode()).isEqualTo(StatusProto.Code.OK); + assertThat(searchResultProto.getResultsCount()).isEqualTo(1); + resultDocument = searchResultProto.getResults(0).getDocument(); + assertThat(resultDocument).isEqualTo(documents.remove(resultDocument.getUri())); + } + + // invalidate rest result + icing.invalidateNextPageToken(searchResultProto.getNextPageToken()); + + searchResultProto = icing.getNextPage(searchResultProto.getNextPageToken()); + assertThat(searchResultProto.getStatus().getCode()).isEqualTo(StatusProto.Code.OK); + assertThat(searchResultProto.getResultsCount()).isEqualTo(0); + } + + @Test public void testDelete() throws Exception { IcingSearchEngineOptions options = IcingSearchEngineOptions.newBuilder().setBaseDir(filesDir).build(); |