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/10 17:04:49 UTC

[couchdb] 01/02: add our own DoubleRange class

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 b0dc6e584cf254a246e0cb843cf3211e6292aaa6
Author: Robert Newson <rn...@apache.org>
AuthorDate: Tue Jan 10 15:06:16 2023 +0000

    add our own DoubleRange class
---
 .../apache/couchdb/nouveau/api/SearchRequest.java  |  2 +-
 .../apache/couchdb/nouveau/api/SearchResults.java  |  1 +
 .../couchdb/nouveau/api/document/DocField.java     |  7 +-
 .../nouveau/api/document/DoublePointDocField.java  |  3 +
 .../nouveau/api/document/StoredDocField.java       |  3 +
 .../nouveau/api/document/StringDocField.java       |  3 +
 .../couchdb/nouveau/api/document/TextDocField.java |  3 +
 .../nouveau/api/facet/range/DoubleRange.java       | 98 ++++++++++++++++++++++
 .../couchdb/nouveau/core/lucene9/Lucene9Index.java | 25 ++++--
 .../apache/couchdb/nouveau/IntegrationTest.java    |  2 +-
 .../couchdb/nouveau/api/SearchRequestTest.java     |  2 +-
 11 files changed, 140 insertions(+), 9 deletions(-)

diff --git a/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/api/SearchRequest.java b/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/api/SearchRequest.java
index 556adbd58..29e3a5dac 100644
--- a/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/api/SearchRequest.java
+++ b/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/api/SearchRequest.java
@@ -23,7 +23,7 @@ import javax.validation.constraints.NotNull;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
 
-import org.apache.couchdb.nouveau.l9x.lucene.facet.range.DoubleRange;
+import org.apache.couchdb.nouveau.api.facet.range.DoubleRange;
 import org.apache.couchdb.nouveau.l9x.lucene.search.FieldDoc;
 
 import io.dropwizard.jackson.JsonSnakeCase;
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 db23e9d29..1bd696b06 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
@@ -39,6 +39,7 @@ public class SearchResults {
     private Map<@NotNull String, Map<@NotNull String, Number>> ranges;
 
     public SearchResults() {
+        // Jackson serialization
     }
 
     public void setTotalHits(final long totalHits) {
diff --git a/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/api/document/DocField.java b/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/api/document/DocField.java
index 54cd244a8..76a9d42f6 100644
--- a/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/api/document/DocField.java
+++ b/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/api/document/DocField.java
@@ -16,14 +16,19 @@ package org.apache.couchdb.nouveau.api.document;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.annotation.JsonSubTypes;
 import com.fasterxml.jackson.annotation.JsonTypeInfo.As;
+
+import io.dropwizard.jackson.JsonSnakeCase;
+
 import com.fasterxml.jackson.annotation.JsonTypeInfo;
 
 @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = As.PROPERTY, property = "@type")
 @JsonSubTypes({
         @JsonSubTypes.Type(value = StringDocField.class, name = "string"),
         @JsonSubTypes.Type(value = TextDocField.class, name = "text"),
-        @JsonSubTypes.Type(value = DoublePointDocField.class, name = "double_point")
+        @JsonSubTypes.Type(value = DoublePointDocField.class, name = "double_point"),
+        @JsonSubTypes.Type(value = StoredDocField.class, name = "stored")
 })
+@JsonSnakeCase
 public abstract class DocField {
 
     protected String name;
diff --git a/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/api/document/DoublePointDocField.java b/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/api/document/DoublePointDocField.java
index c36149f2d..454f429c8 100644
--- a/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/api/document/DoublePointDocField.java
+++ b/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/api/document/DoublePointDocField.java
@@ -15,6 +15,9 @@ package org.apache.couchdb.nouveau.api.document;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
 
+import io.dropwizard.jackson.JsonSnakeCase;
+
+@JsonSnakeCase
 public class DoublePointDocField extends DocField {
 
     private double value;
diff --git a/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/api/document/StoredDocField.java b/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/api/document/StoredDocField.java
index 1de57a04c..181c9364a 100644
--- a/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/api/document/StoredDocField.java
+++ b/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/api/document/StoredDocField.java
@@ -15,6 +15,9 @@ package org.apache.couchdb.nouveau.api.document;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
 
+import io.dropwizard.jackson.JsonSnakeCase;
+
+@JsonSnakeCase
 public final class StoredDocField extends DocField {
 
     private Object value;
diff --git a/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/api/document/StringDocField.java b/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/api/document/StringDocField.java
index 6675bc50c..248effb6c 100644
--- a/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/api/document/StringDocField.java
+++ b/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/api/document/StringDocField.java
@@ -15,6 +15,9 @@ package org.apache.couchdb.nouveau.api.document;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
 
+import io.dropwizard.jackson.JsonSnakeCase;
+
+@JsonSnakeCase
 public final class StringDocField extends DocField {
 
     private String value;
diff --git a/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/api/document/TextDocField.java b/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/api/document/TextDocField.java
index bf5fa4404..94d17ce07 100644
--- a/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/api/document/TextDocField.java
+++ b/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/api/document/TextDocField.java
@@ -15,6 +15,9 @@ package org.apache.couchdb.nouveau.api.document;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
 
+import io.dropwizard.jackson.JsonSnakeCase;
+
+@JsonSnakeCase
 public final class TextDocField extends DocField {
 
     private String value;
diff --git a/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/api/facet/range/DoubleRange.java b/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/api/facet/range/DoubleRange.java
new file mode 100644
index 000000000..fa836d2c0
--- /dev/null
+++ b/java/nouveau/server/src/main/java/org/apache/couchdb/nouveau/api/facet/range/DoubleRange.java
@@ -0,0 +1,98 @@
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.couchdb.nouveau.api.facet.range;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+import io.dropwizard.jackson.JsonSnakeCase;
+
+@JsonSnakeCase
+public final class DoubleRange {
+
+    private String label;
+
+    private double min;
+
+    private boolean minInclusive = true;
+
+    private double max;
+
+    private boolean maxInclusive = true;
+
+    public DoubleRange() {
+        // Jackson serialization
+    }
+
+    public DoubleRange(String label, double min, boolean minInclusive, double max, boolean maxInclusive) {
+        this.label = label;
+        this.min = min;
+        this.minInclusive = minInclusive;
+        this.max = max;
+        this.maxInclusive = maxInclusive;
+    }
+
+    @JsonProperty
+    public String getLabel() {
+        return label;
+    }
+
+    public void setLabel(String label) {
+        this.label = label;
+    }
+
+    @JsonProperty
+    public double getMin() {
+        return min;
+    }
+
+    public void setMin(double min) {
+        this.min = min;
+    }
+
+    @JsonProperty
+    public boolean getMinInclusive() {
+        return minInclusive;
+    }
+
+    public void setMinInclusive(boolean minInclusive) {
+        this.minInclusive = minInclusive;
+    }
+
+    @JsonProperty
+    public double getMax() 
+    {
+        return max;
+    }
+
+    public void setMax(double max) {
+        this.max = max;
+    }
+
+    @JsonProperty
+    public boolean getMaxInclusive() {
+        return maxInclusive;
+    }
+
+    public void setMaxInclusive(boolean maxInclusive) {
+        this.maxInclusive = maxInclusive;
+    }
+
+    @Override
+    public String toString() {
+        return "DoubleRange [label=" + label + ", min=" + min + ", minInclusive=" + minInclusive + ", max=" + max
+                + ", maxInclusive=" + maxInclusive + "]";
+    }
+        
+}
+
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 e49ff98d9..e6e9f42ac 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
@@ -38,13 +38,13 @@ import org.apache.couchdb.nouveau.api.document.DoublePointDocField;
 import org.apache.couchdb.nouveau.api.document.StoredDocField;
 import org.apache.couchdb.nouveau.api.document.StringDocField;
 import org.apache.couchdb.nouveau.api.document.TextDocField;
+import org.apache.couchdb.nouveau.api.facet.range.DoubleRange;
 import org.apache.couchdb.nouveau.core.Index;
 import org.apache.couchdb.nouveau.core.QueryParser;
 import org.apache.couchdb.nouveau.core.QueryParserException;
 import org.apache.couchdb.nouveau.l9x.lucene.analysis.Analyzer;
 import org.apache.couchdb.nouveau.l9x.lucene.document.Document;
 import org.apache.couchdb.nouveau.l9x.lucene.document.DoublePoint;
-import org.apache.couchdb.nouveau.l9x.lucene.document.Field;
 import org.apache.couchdb.nouveau.l9x.lucene.document.SortedDocValuesField;
 import org.apache.couchdb.nouveau.l9x.lucene.document.StoredField;
 import org.apache.couchdb.nouveau.l9x.lucene.document.StringField;
@@ -57,7 +57,6 @@ import org.apache.couchdb.nouveau.l9x.lucene.facet.FacetsCollectorManager;
 import org.apache.couchdb.nouveau.l9x.lucene.facet.LabelAndValue;
 import org.apache.couchdb.nouveau.l9x.lucene.facet.StringDocValuesReaderState;
 import org.apache.couchdb.nouveau.l9x.lucene.facet.StringValueFacetCounts;
-import org.apache.couchdb.nouveau.l9x.lucene.facet.range.DoubleRange;
 import org.apache.couchdb.nouveau.l9x.lucene.facet.range.DoubleRangeFacetCounts;
 import org.apache.couchdb.nouveau.l9x.lucene.index.IndexWriter;
 import org.apache.couchdb.nouveau.l9x.lucene.index.IndexWriterConfig;
@@ -83,7 +82,6 @@ import org.apache.couchdb.nouveau.l9x.lucene.util.BytesRef;
 
 class Lucene9Index extends Index {
 
-    private static final DoubleRange[] EMPTY_DOUBLE_RANGE_ARRAY = new DoubleRange[0];
     private static final Sort DEFAULT_SORT = new Sort(SortField.FIELD_SCORE,
             new SortField("_id", SortField.Type.STRING));
     private static final Pattern SORT_FIELD_RE = Pattern.compile("^([-+])?([\\.\\w]+)(?:<(\\w+)>)?$");
@@ -245,14 +243,31 @@ class Lucene9Index extends Index {
             final Map<String, Map<String, Number>> rangesMap = new HashMap<String, Map<String, Number>>(
                     searchRequest.getRanges().size());
             for (final Entry<String, List<DoubleRange>> entry : searchRequest.getRanges().entrySet()) {
-                final DoubleRangeFacetCounts counts = new DoubleRangeFacetCounts(entry.getKey(), fc,
-                        entry.getValue().toArray(EMPTY_DOUBLE_RANGE_ARRAY));
+                final DoubleRangeFacetCounts counts = new DoubleRangeFacetCounts(entry.getKey(), fc, convertDoubleRanges(entry.getValue()));
                 rangesMap.put(entry.getKey(), collectFacets(counts, searchRequest.getTopN(), entry.getKey()));
             }
             searchResults.setRanges(rangesMap);
         }
     }
 
+    private org.apache.couchdb.nouveau.l9x.lucene.facet.range.DoubleRange[] convertDoubleRanges(final List<DoubleRange> ranges) {
+        final org.apache.couchdb.nouveau.l9x.lucene.facet.range.DoubleRange[] result = new org.apache.couchdb.nouveau.l9x.lucene.facet.range.DoubleRange[ranges.size()];
+        for (int i = 0; i < ranges.size(); i++) {
+            result[i] = convertDoubleRange(ranges.get(i));
+        }
+        return result;
+    }
+
+    private org.apache.couchdb.nouveau.l9x.lucene.facet.range.DoubleRange convertDoubleRange(final DoubleRange range) {
+        return new org.apache.couchdb.nouveau.l9x.lucene.facet.range.DoubleRange(
+            range.getLabel(),
+            range.getMin(),
+            range.getMinInclusive(),
+            range.getMax(),
+            range.getMaxInclusive()
+        );
+    }
+
     private Map<String, Number> collectFacets(final Facets facets, final int topN, final String dim)
             throws IOException {
         final FacetResult topChildren = facets.getTopChildren(topN, dim);
diff --git a/java/nouveau/server/src/test/java/org/apache/couchdb/nouveau/IntegrationTest.java b/java/nouveau/server/src/test/java/org/apache/couchdb/nouveau/IntegrationTest.java
index 81ac17e56..d67153f12 100644
--- a/java/nouveau/server/src/test/java/org/apache/couchdb/nouveau/IntegrationTest.java
+++ b/java/nouveau/server/src/test/java/org/apache/couchdb/nouveau/IntegrationTest.java
@@ -30,7 +30,7 @@ import org.apache.couchdb.nouveau.api.SearchRequest;
 import org.apache.couchdb.nouveau.api.SearchResults;
 import org.apache.couchdb.nouveau.api.document.StringDocField;
 import org.apache.couchdb.nouveau.api.document.TextDocField;
-import org.apache.couchdb.nouveau.l9x.lucene.facet.range.DoubleRange;
+import org.apache.couchdb.nouveau.api.facet.range.DoubleRange;
 import org.apache.couchdb.nouveau.l9x.lucene.search.FieldDoc;
 import org.apache.couchdb.nouveau.l9x.lucene.search.TotalHits;
 import org.apache.couchdb.nouveau.l9x.lucene.search.TotalHits.Relation;
diff --git a/java/nouveau/server/src/test/java/org/apache/couchdb/nouveau/api/SearchRequestTest.java b/java/nouveau/server/src/test/java/org/apache/couchdb/nouveau/api/SearchRequestTest.java
index e6986ee8a..886f376de 100644
--- a/java/nouveau/server/src/test/java/org/apache/couchdb/nouveau/api/SearchRequestTest.java
+++ b/java/nouveau/server/src/test/java/org/apache/couchdb/nouveau/api/SearchRequestTest.java
@@ -6,7 +6,7 @@ import static org.assertj.core.api.Assertions.assertThat;
 import java.util.List;
 import java.util.Map;
 
-import org.apache.couchdb.nouveau.l9x.lucene.facet.range.DoubleRange;
+import org.apache.couchdb.nouveau.api.facet.range.DoubleRange;
 import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.Test;