• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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