1 /* 2 * Copyright 2023 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package android.app.appsearch; 18 19 import static com.google.common.truth.Truth.assertThat; 20 21 import org.junit.Test; 22 23 import java.util.List; 24 import java.util.Map; 25 26 public class SearchResultInternalTest { 27 @Test testSearchResultBuilderCopyConstructor()28 public void testSearchResultBuilderCopyConstructor() { 29 GenericDocument document = 30 new GenericDocument.Builder<>("namespace", "id", "schemaType").build(); 31 SearchResult searchResult = 32 new SearchResult.Builder("package", "database") 33 .setGenericDocument(document) 34 .setRankingSignal(1.23) 35 .addJoinedResult( 36 new SearchResult.Builder("pkg1", "db1") 37 .setGenericDocument(document) 38 .build()) 39 .addJoinedResult( 40 new SearchResult.Builder("pkg2", "db2") 41 .setGenericDocument(document) 42 .build()) 43 .addMatchInfo(new SearchResult.MatchInfo.Builder("propertyPath1").build()) 44 .addMatchInfo(new SearchResult.MatchInfo.Builder("propertyPath2").build()) 45 .addMatchInfo(new SearchResult.MatchInfo.Builder("propertyPath3").build()) 46 .build(); 47 SearchResult searchResultCopy = new SearchResult.Builder(searchResult).build(); 48 assertThat(searchResultCopy.getGenericDocument()) 49 .isEqualTo(searchResult.getGenericDocument()); 50 assertThat(searchResultCopy.getRankingSignal()).isEqualTo(searchResult.getRankingSignal()); 51 // Specifically test JoinedResults and MatchInfos with different sizes since briefly had 52 // a bug where we looped through joinedResults using matchInfos.size() 53 assertThat(searchResultCopy.getJoinedResults().size()) 54 .isEqualTo(searchResult.getJoinedResults().size()); 55 assertThat(searchResultCopy.getJoinedResults().get(0).getPackageName()).isEqualTo("pkg1"); 56 assertThat(searchResultCopy.getJoinedResults().get(0).getDatabaseName()).isEqualTo("db1"); 57 assertThat(searchResultCopy.getJoinedResults().get(1).getPackageName()).isEqualTo("pkg2"); 58 assertThat(searchResultCopy.getJoinedResults().get(1).getDatabaseName()).isEqualTo("db2"); 59 assertThat(searchResultCopy.getMatchInfos().size()) 60 .isEqualTo(searchResult.getMatchInfos().size()); 61 assertThat(searchResultCopy.getMatchInfos().get(0).getPropertyPath()) 62 .isEqualTo("propertyPath1"); 63 assertThat(searchResultCopy.getMatchInfos().get(1).getPropertyPath()) 64 .isEqualTo("propertyPath2"); 65 assertThat(searchResultCopy.getMatchInfos().get(2).getPropertyPath()) 66 .isEqualTo("propertyPath3"); 67 } 68 69 @Test testSearchResultBuilderCopyConstructor_informationalRankingSignal()70 public void testSearchResultBuilderCopyConstructor_informationalRankingSignal() { 71 GenericDocument document = 72 new GenericDocument.Builder<>("namespace", "id", "schemaType").build(); 73 SearchResult searchResult = 74 new SearchResult.Builder("package", "database") 75 .setGenericDocument(document) 76 .setRankingSignal(1.23) 77 .addInformationalRankingSignal(2) 78 .addInformationalRankingSignal(3) 79 .build(); 80 SearchResult searchResultCopy = new SearchResult.Builder(searchResult).build(); 81 assertThat(searchResultCopy.getRankingSignal()).isEqualTo(searchResult.getRankingSignal()); 82 assertThat(searchResultCopy.getInformationalRankingSignals()) 83 .isEqualTo(searchResult.getInformationalRankingSignals()); 84 } 85 86 @Test testSearchResultBuilderCopyConstructor_parentType()87 public void testSearchResultBuilderCopyConstructor_parentType() { 88 GenericDocument document = 89 new GenericDocument.Builder<>("namespace", "id", "schemaType1").build(); 90 SearchResult searchResult = 91 new SearchResult.Builder("package", "database") 92 .setGenericDocument(document) 93 .setParentTypeMap( 94 Map.of( 95 "schemaType1", List.of("parent1", "parent2"), 96 "schemaType2", List.of("parent3", "parent4"))) 97 .build(); 98 SearchResult searchResultCopy = new SearchResult.Builder(searchResult).build(); 99 assertThat(searchResultCopy.getParentTypeMap()) 100 .containsExactlyEntriesIn(searchResult.getParentTypeMap()); 101 } 102 103 @Test testSearchResultBuilder_clearJoinedResults()104 public void testSearchResultBuilder_clearJoinedResults() { 105 GenericDocument document = 106 new GenericDocument.Builder<>("namespace", "id", "schemaType").build(); 107 SearchResult searchResult = 108 new SearchResult.Builder("package", "database") 109 .setGenericDocument(document) 110 .addJoinedResult( 111 new SearchResult.Builder("pkg", "db") 112 .setGenericDocument(document) 113 .build()) 114 .clearJoinedResults() 115 .build(); 116 assertThat(searchResult.getJoinedResults()).isEmpty(); 117 } 118 119 @Test testMatchInfoBuilderCopyConstructor()120 public void testMatchInfoBuilderCopyConstructor() { 121 SearchResult.MatchRange exactMatchRange = new SearchResult.MatchRange(3, 8); 122 SearchResult.MatchRange submatchRange = new SearchResult.MatchRange(3, 5); 123 SearchResult.MatchRange snippetMatchRange = new SearchResult.MatchRange(1, 10); 124 SearchResult.MatchInfo matchInfo = 125 new SearchResult.MatchInfo.Builder("propertyPath1") 126 .setExactMatchRange(exactMatchRange) 127 .setSubmatchRange(submatchRange) 128 .setSnippetRange(snippetMatchRange) 129 .build(); 130 SearchResult.MatchInfo matchInfoCopy = 131 new SearchResult.MatchInfo.Builder(matchInfo).build(); 132 assertThat(matchInfoCopy.getPropertyPath()).isEqualTo("propertyPath1"); 133 assertThat(matchInfoCopy.getExactMatchRange()).isEqualTo(exactMatchRange); 134 assertThat(matchInfoCopy.getSubmatchRange()).isEqualTo(submatchRange); 135 assertThat(matchInfoCopy.getSnippetRange()).isEqualTo(snippetMatchRange); 136 } 137 138 @Test testMatchInfoBuilderCopyConstructor_embeddingMatchInfoEnabled()139 public void testMatchInfoBuilderCopyConstructor_embeddingMatchInfoEnabled() { 140 SearchResult.MatchRange exactMatchRange = new SearchResult.MatchRange(3, 8); 141 SearchResult.MatchRange submatchRange = new SearchResult.MatchRange(3, 5); 142 SearchResult.MatchRange snippetMatchRange = new SearchResult.MatchRange(1, 10); 143 144 double semanticScore = 1.1d; 145 int queryEmbeddingVectorIndex = 1; 146 int embeddingSearchMetricType = SearchSpec.EMBEDDING_SEARCH_METRIC_TYPE_COSINE; 147 SearchResult.EmbeddingMatchInfo embeddingMatchInfo = 148 new SearchResult.EmbeddingMatchInfo( 149 semanticScore, queryEmbeddingVectorIndex, embeddingSearchMetricType); 150 151 SearchResult.MatchInfo matchInfo1 = 152 new SearchResult.MatchInfo.Builder("propertyPath1") 153 .setExactMatchRange(exactMatchRange) 154 .setSubmatchRange(submatchRange) 155 .setSnippetRange(snippetMatchRange) 156 .build(); 157 158 SearchResult.MatchInfo matchInfo2 = 159 new SearchResult.MatchInfo.Builder("propertyPath2") 160 .setEmbeddingMatch(embeddingMatchInfo) 161 .build(); 162 163 SearchResult.MatchInfo matchInfoCopy1 = 164 new SearchResult.MatchInfo.Builder(matchInfo1).build(); 165 assertThat(matchInfoCopy1.getPropertyPath()).isEqualTo("propertyPath1"); 166 assertThat(matchInfoCopy1.getTextMatch()).isNotNull(); 167 assertThat(matchInfoCopy1.getTextMatch().getExactMatchRange()).isEqualTo(exactMatchRange); 168 assertThat(matchInfoCopy1.getTextMatch().getSubmatchRange()).isEqualTo(submatchRange); 169 assertThat(matchInfoCopy1.getTextMatch().getSnippetRange()).isEqualTo(snippetMatchRange); 170 assertThat(matchInfoCopy1.getEmbeddingMatch()).isNull(); 171 172 SearchResult.MatchInfo matchInfoCopy2 = 173 new SearchResult.MatchInfo.Builder(matchInfo2).build(); 174 assertThat(matchInfoCopy2.getPropertyPath()).isEqualTo("propertyPath2"); 175 assertThat(matchInfoCopy2.getEmbeddingMatch()).isNotNull(); 176 assertThat(matchInfoCopy2.getEmbeddingMatch().getSemanticScore()).isEqualTo(semanticScore); 177 assertThat(matchInfoCopy2.getEmbeddingMatch().getQueryEmbeddingVectorIndex()) 178 .isEqualTo(queryEmbeddingVectorIndex); 179 assertThat(matchInfoCopy2.getEmbeddingMatch().getEmbeddingSearchMetricType()) 180 .isEqualTo(embeddingSearchMetricType); 181 assertThat(matchInfoCopy2.getTextMatch()).isNull(); 182 } 183 } 184