aboutsummaryrefslogtreecommitdiff
path: root/java
diff options
context:
space:
mode:
authorTerry Wang <tytytyww@google.com>2020-07-28 16:32:46 -0700
committerTerry Wang <tytytyww@google.com>2020-07-28 16:32:46 -0700
commit9e9c7171c44842a7251872f23a9d824f0553ce93 (patch)
tree20ac2dacc85345fdf9bceee096143e0bbffaf710 /java
parentdd9a0fa36f5a982ccb2ac30108ed067479d73b85 (diff)
parent9f1b9cf4dc93fa7bfee0a3637c93dc5b557aab30 (diff)
downloadicing-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.java29
-rw-r--r--java/tests/instrumentation/src/com/google/android/icing/IcingSearchEngineTest.java59
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();