aboutsummaryrefslogtreecommitdiff
path: root/java
diff options
context:
space:
mode:
authorAlexander Dorokhine <adorokhine@google.com>2021-11-05 15:01:48 -0700
committerAlexander Dorokhine <adorokhine@google.com>2021-11-05 15:06:39 -0700
commitd4760eba4d61908605fef358b0851cb89f3dd9d8 (patch)
treeef49d61e92007f8eb1a3027803206cf30e91d2fb /java
parent7ad2a74434a30d786ba247a5320a673d2d0dea63 (diff)
parentef33b5af6b6c19e22d23ef0d70402fa30da20bbd (diff)
downloadicing-d4760eba4d61908605fef358b0851cb89f3dd9d8.tar.gz
Merge remote-tracking branch 'goog/androidx-platform-dev' into master
* goog/androidx-platform-dev: Sync from upstream. Sync from upstream. Add an OWNERS file for external/icing. Sync from upstream. Sync from upstream. Merge androidx-platform-dev/external/icing upstream-master into upstream-master Sync from upstream. Sync from upstream. Commit descriptions: ================== Add Initialization Count marker file to break out of crash loops. ================== Delete the Simple Normalizer. ================== Add submatch information to identify a submatch within a document. ================== Remove no-longer-used write paths for file-backed-proto-log. ================ Modify segmentation rules to consider any segment that begins with a non-Ascii alphanumeric character as valid ================= Implement CalculateNormalizedMatchLength for IcuNormalizer. ================ Add additional benchmark cases that were useful in developing submatching and CalculateNormalizedMatchLength for IcuNormalizer ================= Switch NormalizationMap from static const std::unordered_map<char16_t, char16_t>& to static const std::unordered_map<char16_t, char16_t> *const. ================ Implement ranking in FindTermByPrefix. ================ Fork proto's GzipStream into Icing Lib. ================ Remove token limit behavior from index-processor. ================ Replace refs to c lib headers w/ c++ stdlib equivalents. ================ Update IDF component of BM25F Calculator in IcingLib ================ Expose QuerySuggestions API. ================ Change the tokenizer used in QuerySuggest. ================ Add SectionWeights API to Icing. ================ Apply SectionWeights to BM25F Scoring. ================ Replaces uses of u_strTo/FromUTF32 w/ u_strTo/FromUTF8. Bug: 147509515 Bug: 149610413 Bug: 152934343 Bug: 195720764 Bug: 196257995 Bug: 196771754 Bug: 202308641 Bug: 203700301 Test: Presubmit Change-Id: I31e39a3e5fe5ecccafadf34ef72a7442902bc0cd
Diffstat (limited to 'java')
-rw-r--r--java/src/com/google/android/icing/IcingSearchEngine.java25
-rw-r--r--java/tests/instrumentation/src/com/google/android/icing/IcingSearchEngineTest.java36
2 files changed, 61 insertions, 0 deletions
diff --git a/java/src/com/google/android/icing/IcingSearchEngine.java b/java/src/com/google/android/icing/IcingSearchEngine.java
index 1f5fb51..95e0c84 100644
--- a/java/src/com/google/android/icing/IcingSearchEngine.java
+++ b/java/src/com/google/android/icing/IcingSearchEngine.java
@@ -43,6 +43,8 @@ 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.SuggestionResponse;
+import com.google.android.icing.proto.SuggestionSpecProto;
import com.google.android.icing.proto.UsageReport;
import com.google.protobuf.ExtensionRegistryLite;
import com.google.protobuf.InvalidProtocolBufferException;
@@ -370,6 +372,26 @@ public class IcingSearchEngine implements Closeable {
}
@NonNull
+ public SuggestionResponse searchSuggestions(@NonNull SuggestionSpecProto suggestionSpec) {
+ byte[] suggestionResponseBytes = nativeSearchSuggestions(this, suggestionSpec.toByteArray());
+ if (suggestionResponseBytes == null) {
+ Log.e(TAG, "Received null suggestionResponseBytes from native.");
+ return SuggestionResponse.newBuilder()
+ .setStatus(StatusProto.newBuilder().setCode(StatusProto.Code.INTERNAL))
+ .build();
+ }
+
+ try {
+ return SuggestionResponse.parseFrom(suggestionResponseBytes, EXTENSION_REGISTRY_LITE);
+ } catch (InvalidProtocolBufferException e) {
+ Log.e(TAG, "Error parsing suggestionResponseBytes.", e);
+ return SuggestionResponse.newBuilder()
+ .setStatus(StatusProto.newBuilder().setCode(StatusProto.Code.INTERNAL))
+ .build();
+ }
+ }
+
+ @NonNull
public DeleteByNamespaceResultProto deleteByNamespace(@NonNull String namespace) {
throwIfClosed();
@@ -604,4 +626,7 @@ public class IcingSearchEngine implements Closeable {
private static native byte[] nativeGetStorageInfo(IcingSearchEngine instance);
private static native byte[] nativeReset(IcingSearchEngine instance);
+
+ private static native byte[] nativeSearchSuggestions(
+ IcingSearchEngine instance, byte[] suggestionSpecBytes);
}
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 0cee80c..cb28331 100644
--- a/java/tests/instrumentation/src/com/google/android/icing/IcingSearchEngineTest.java
+++ b/java/tests/instrumentation/src/com/google/android/icing/IcingSearchEngineTest.java
@@ -51,6 +51,8 @@ import com.google.android.icing.proto.StatusProto;
import com.google.android.icing.proto.StorageInfoResultProto;
import com.google.android.icing.proto.StringIndexingConfig;
import com.google.android.icing.proto.StringIndexingConfig.TokenizerType;
+import com.google.android.icing.proto.SuggestionResponse;
+import com.google.android.icing.proto.SuggestionSpecProto;
import com.google.android.icing.proto.TermMatchType;
import com.google.android.icing.proto.UsageReport;
import com.google.android.icing.IcingSearchEngine;
@@ -623,6 +625,40 @@ public final class IcingSearchEngineTest {
assertThat(match).isEqualTo("𐀂𐀃");
}
+ @Test
+ public void testSearchSuggestions() {
+ assertStatusOk(icingSearchEngine.initialize().getStatus());
+
+ SchemaTypeConfigProto emailTypeConfig = createEmailTypeConfig();
+ SchemaProto schema = SchemaProto.newBuilder().addTypes(emailTypeConfig).build();
+ assertThat(
+ icingSearchEngine
+ .setSchema(schema, /*ignoreErrorsAndDeleteDocuments=*/ false)
+ .getStatus()
+ .getCode())
+ .isEqualTo(StatusProto.Code.OK);
+
+ DocumentProto emailDocument1 =
+ createEmailDocument("namespace", "uri1").toBuilder()
+ .addProperties(PropertyProto.newBuilder().setName("subject").addStringValues("fo"))
+ .build();
+ DocumentProto emailDocument2 =
+ createEmailDocument("namespace", "uri2").toBuilder()
+ .addProperties(PropertyProto.newBuilder().setName("subject").addStringValues("foo"))
+ .build();
+ assertStatusOk(icingSearchEngine.put(emailDocument1).getStatus());
+ assertStatusOk(icingSearchEngine.put(emailDocument2).getStatus());
+
+ SuggestionSpecProto suggestionSpec =
+ SuggestionSpecProto.newBuilder().setPrefix("f").setNumToReturn(10).build();
+
+ SuggestionResponse response = icingSearchEngine.searchSuggestions(suggestionSpec);
+ assertStatusOk(response.getStatus());
+ assertThat(response.getSuggestionsList()).hasSize(2);
+ assertThat(response.getSuggestions(0).getQuery()).isEqualTo("foo");
+ assertThat(response.getSuggestions(1).getQuery()).isEqualTo("fo");
+ }
+
private static void assertStatusOk(StatusProto status) {
assertWithMessage(status.getMessage()).that(status.getCode()).isEqualTo(StatusProto.Code.OK);
}