You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@couchdb.apache.org by rn...@apache.org on 2023/01/06 14:01:37 UTC

[couchdb] 06/07: flatten TotalHits to two fields

This is an automated email from the ASF dual-hosted git repository.

rnewson pushed a commit to branch import-nouveau-reorg
in repository https://gitbox.apache.org/repos/asf/couchdb.git

commit 36e076f14c01abc56375f6a7fb2f988c1c3a6020
Author: Robert Newson <rn...@apache.org>
AuthorDate: Fri Jan 6 12:27:45 2023 +0000

    flatten TotalHits to two fields
---
 .../apache/couchdb/nouveau/api/SearchResults.java  | 21 ++++++++++++-----
 .../couchdb/nouveau/core/lucene9/Lucene9Index.java |  3 ++-
 src/nouveau/src/nouveau_fabric_search.erl          | 26 +++++++++-------------
 3 files changed, 27 insertions(+), 23 deletions(-)

diff --git a/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/api/SearchResults.java b/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/api/SearchResults.java
index cb4d7a40c..db23e9d29 100644
--- a/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/api/SearchResults.java
+++ b/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/api/SearchResults.java
@@ -16,19 +16,20 @@ package org.apache.couchdb.nouveau.api;
 import java.util.List;
 import java.util.Map;
 
+import javax.validation.constraints.Min;
 import javax.validation.constraints.NotNull;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
 
 import io.dropwizard.jackson.JsonSnakeCase;
 
-import org.apache.couchdb.nouveau.l9x.lucene.search.TotalHits;
-
 @JsonSnakeCase
 public class SearchResults {
 
-    @NotNull
-    private TotalHits totalHits;
+    @Min(0)
+    private long totalHits;
+
+    private String totalHitsRelation;
 
     @NotNull
     private List<@NotNull SearchHit> hits;
@@ -40,15 +41,23 @@ public class SearchResults {
     public SearchResults() {
     }
 
-    public void setTotalHits(final TotalHits totalHits) {
+    public void setTotalHits(final long totalHits) {
         this.totalHits = totalHits;
     }
 
     @JsonProperty
-    public TotalHits getTotalHits() {
+    public long getTotalHits() {
         return totalHits;
     }
 
+    public String getTotalHitsRelation() {
+        return totalHitsRelation;
+    }
+
+    public void setTotalHitsRelation(String totalHitsRelation) {
+        this.totalHitsRelation = totalHitsRelation;
+    }
+
     public void setHits(final List<SearchHit> hits) {
         this.hits = hits;
     }
diff --git a/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/core/lucene9/Lucene9Index.java b/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/core/lucene9/Lucene9Index.java
index c17fe3a04..740c83cfe 100644
--- a/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/core/lucene9/Lucene9Index.java
+++ b/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/core/lucene9/Lucene9Index.java
@@ -218,7 +218,8 @@ class Lucene9Index extends Index {
             hits.add(new SearchHit(doc.get("_id"), (FieldDoc) scoreDoc, fields));
         }
 
-        searchResults.setTotalHits(topDocs.totalHits);
+        searchResults.setTotalHits(topDocs.totalHits.value);
+        searchResults.setTotalHitsRelation(topDocs.totalHits.relation.name());
         searchResults.setHits(hits);
     }
 
diff --git a/src/nouveau/src/nouveau_fabric_search.erl b/src/nouveau/src/nouveau_fabric_search.erl
index 52eb0ac02..9dd5c8181 100644
--- a/src/nouveau/src/nouveau_fabric_search.erl
+++ b/src/nouveau/src/nouveau_fabric_search.erl
@@ -105,7 +105,10 @@ handle_message(Else, _Shard, _State) ->
 merge_search_results(A, B, #state{} = State) ->
     #{
         <<"total_hits">> => merge_total_hits(
-            maps:get(<<"total_hits">>, A, #{}), maps:get(<<"total_hits">>, B, #{})
+            maps:get(<<"total_hits">>, A, 0), maps:get(<<"total_hits">>, B, 0)
+        ),
+        <<"total_hits_relation">> => merge_total_hits_relation(
+            maps:get(<<"total_hits_relation">>, A, null), maps:get(<<"total_hits_relation">>, B, null)
         ),
         <<"hits">> => merge_hits(
             maps:get(<<"hits">>, A, []),
@@ -122,21 +125,12 @@ merge_search_results(A, B, #state{} = State) ->
     }.
 
 merge_total_hits(TotalHitsA, TotalHitsB) ->
-    ValueA = maps:get(<<"value">>, TotalHitsA, 0),
-    ValueB = maps:get(<<"value">>, TotalHitsB, 0),
-    RelationA = maps:get(<<"relation">>, TotalHitsA, <<"EQUAL_TO">>),
-    RelationB = maps:get(<<"relation">>, TotalHitsB, <<"EQUAL_TO">>),
-    MergedValue = ValueA + ValueB,
-    MergedRelation =
-        if
-            RelationA == <<"GREATER_THAN_OR_EQUAL_TO">> ->
-                <<"GREATER_THAN_OR_EQUAL_TO">>;
-            RelationB == <<"GREATER_THAN_OR_EQUAL_TO">> ->
-                <<"GREATER_THAN_OR_EQUAL_TO">>;
-            true ->
-                <<"EQUAL_TO">>
-        end,
-    #{<<"value">> => MergedValue, <<"relation">> => MergedRelation}.
+    TotalHitsA + TotalHitsB.
+
+merge_total_hits_relation(A, B) when A == <<"GREATER_THAN_OR_EQUAL_TO">>; B == <<"GREATER_THAN_OR_EQUAL_TO">> ->
+    <<"GREATER_THAN_OR_EQUAL_TO">>;
+merge_total_hits_relation(A, B) when A == <<"EQUAL_TO">>; B == <<"EQUAL_TO">> ->
+    <<"EQUAL_TO">>.
 
 merge_hits(HitsA, HitsB, Sort, Limit) ->
     MergedHits = lists:merge(merge_fun(Sort), HitsA, HitsB),