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/07/20 22:09:42 UTC
[couchdb] branch nouveau-locale created (now f707f6b7c)
This is an automated email from the ASF dual-hosted git repository.
rnewson pushed a change to branch nouveau-locale
in repository https://gitbox.apache.org/repos/asf/couchdb.git
at f707f6b7c allow locale setting for number detection
This branch includes the following new commits:
new f707f6b7c allow locale setting for number detection
The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
[couchdb] 01/01: allow locale setting for number detection
Posted by rn...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
rnewson pushed a commit to branch nouveau-locale
in repository https://gitbox.apache.org/repos/asf/couchdb.git
commit f707f6b7c1b04d0ecf0489ddc9b90f06ebe08a8b
Author: Robert Newson <rn...@apache.org>
AuthorDate: Thu Jul 20 22:39:47 2023 +0100
allow locale setting for number detection
---
.../org/apache/couchdb/nouveau/api/SearchRequest.java | 16 ++++++++++++++--
.../apache/couchdb/nouveau/lucene9/Lucene9Index.java | 2 +-
.../couchdb/nouveau/lucene9/NouveauQueryParser.java | 17 ++++++++++++-----
.../couchdb/nouveau/lucene9/NouveauQueryParserTest.java | 3 ++-
src/nouveau/src/nouveau_httpd.erl | 6 ++++++
5 files changed, 35 insertions(+), 9 deletions(-)
diff --git a/nouveau/src/main/java/org/apache/couchdb/nouveau/api/SearchRequest.java b/nouveau/src/main/java/org/apache/couchdb/nouveau/api/SearchRequest.java
index 09f2818aa..d2882dd85 100644
--- a/nouveau/src/main/java/org/apache/couchdb/nouveau/api/SearchRequest.java
+++ b/nouveau/src/main/java/org/apache/couchdb/nouveau/api/SearchRequest.java
@@ -22,6 +22,7 @@ import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Positive;
import java.util.List;
+import java.util.Locale;
import java.util.Map;
import org.apache.couchdb.nouveau.core.ser.PrimitiveWrapper;
@@ -31,6 +32,8 @@ public class SearchRequest {
@NotNull
private String query;
+ private Locale locale = Locale.getDefault();
+
private String partition;
@Positive
@@ -61,6 +64,15 @@ public class SearchRequest {
return query;
}
+ public void setLocale(final Locale locale) {
+ this.locale = locale;
+ }
+
+ @JsonProperty
+ public Locale getLocale() {
+ return locale;
+ }
+
public void setPartition(final String partition) {
this.partition = partition;
}
@@ -142,7 +154,7 @@ public class SearchRequest {
@Override
public String toString() {
- return "SearchRequest [query=" + query + ", sort=" + sort + ", limit=" + limit + ", after=" + after
- + ", counts=" + counts + ", ranges=" + ranges + "]";
+ return "SearchRequest [query=" + query + ", locale=" + locale + ", sort=" + sort + ", limit=" + limit
+ + ", after=" + after + ", counts=" + counts + ", ranges=" + ranges + "]";
}
}
diff --git a/nouveau/src/main/java/org/apache/couchdb/nouveau/lucene9/Lucene9Index.java b/nouveau/src/main/java/org/apache/couchdb/nouveau/lucene9/Lucene9Index.java
index 0de610f84..69e6b1264 100644
--- a/nouveau/src/main/java/org/apache/couchdb/nouveau/lucene9/Lucene9Index.java
+++ b/nouveau/src/main/java/org/apache/couchdb/nouveau/lucene9/Lucene9Index.java
@@ -489,7 +489,7 @@ public class Lucene9Index extends Index {
}
private Query parse(final SearchRequest request) {
- var queryParser = new NouveauQueryParser(analyzer);
+ var queryParser = new NouveauQueryParser(analyzer, request.getLocale());
Query result;
try {
result = queryParser.parse(request.getQuery(), "default");
diff --git a/nouveau/src/main/java/org/apache/couchdb/nouveau/lucene9/NouveauQueryParser.java b/nouveau/src/main/java/org/apache/couchdb/nouveau/lucene9/NouveauQueryParser.java
index 6516efc2c..730066dcc 100644
--- a/nouveau/src/main/java/org/apache/couchdb/nouveau/lucene9/NouveauQueryParser.java
+++ b/nouveau/src/main/java/org/apache/couchdb/nouveau/lucene9/NouveauQueryParser.java
@@ -16,6 +16,7 @@ package org.apache.couchdb.nouveau.lucene9;
import java.text.NumberFormat;
import java.text.ParseException;
import java.util.List;
+import java.util.Locale;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.queryparser.flexible.core.QueryNodeException;
import org.apache.lucene.queryparser.flexible.core.QueryParserHelper;
@@ -55,11 +56,11 @@ import org.apache.lucene.search.Query;
public final class NouveauQueryParser extends QueryParserHelper {
- public NouveauQueryParser(final Analyzer analyzer) {
+ public NouveauQueryParser(final Analyzer analyzer, final Locale locale) {
super(
new StandardQueryConfigHandler(),
new StandardSyntaxParser(),
- new NouveauQueryNodeProcessorPipeline(),
+ new NouveauQueryNodeProcessorPipeline(locale),
new StandardQueryTreeBuilder());
getQueryConfigHandler().set(ConfigurationKeys.ENABLE_POSITION_INCREMENTS, true);
getQueryConfigHandler().set(ConfigurationKeys.ANALYZER, analyzer);
@@ -77,7 +78,7 @@ public final class NouveauQueryParser extends QueryParserHelper {
*/
public static class NouveauQueryNodeProcessorPipeline extends QueryNodeProcessorPipeline {
- public NouveauQueryNodeProcessorPipeline() {
+ public NouveauQueryNodeProcessorPipeline(final Locale locale) {
super(null);
add(new WildcardQueryNodeProcessor());
add(new MultiFieldQueryNodeProcessor());
@@ -85,7 +86,7 @@ public final class NouveauQueryParser extends QueryParserHelper {
add(new RegexpQueryNodeProcessor());
add(new MatchAllDocsQueryNodeProcessor());
add(new OpenRangeQueryNodeProcessor());
- add(new NouveauPointProcessor());
+ add(new NouveauPointProcessor(locale));
add(new TermRangeQueryNodeProcessor());
add(new AllowLeadingWildcardProcessor());
add(new AnalyzerQueryNodeProcessor());
@@ -107,9 +108,15 @@ public final class NouveauQueryParser extends QueryParserHelper {
*/
public static class NouveauPointProcessor extends QueryNodeProcessorImpl {
+ private final Locale locale;
+
+ NouveauPointProcessor(final Locale locale) {
+ this.locale = locale;
+ }
+
@Override
protected QueryNode postProcessNode(final QueryNode node) throws QueryNodeException {
- final var numberFormat = NumberFormat.getInstance();
+ final var numberFormat = NumberFormat.getInstance(locale);
final var pointsConfig = new PointsConfig(numberFormat, Double.class);
if (node instanceof FieldQueryNode && !(node.getParent() instanceof RangeQueryNode)) {
diff --git a/nouveau/src/test/java/org/apache/couchdb/nouveau/lucene9/NouveauQueryParserTest.java b/nouveau/src/test/java/org/apache/couchdb/nouveau/lucene9/NouveauQueryParserTest.java
index 3b41f4397..2d90f47fc 100644
--- a/nouveau/src/test/java/org/apache/couchdb/nouveau/lucene9/NouveauQueryParserTest.java
+++ b/nouveau/src/test/java/org/apache/couchdb/nouveau/lucene9/NouveauQueryParserTest.java
@@ -15,6 +15,7 @@ package org.apache.couchdb.nouveau.lucene9;
import static org.assertj.core.api.Assertions.assertThat;
+import java.util.Locale;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.DoublePoint;
import org.apache.lucene.index.Term;
@@ -34,7 +35,7 @@ public class NouveauQueryParserTest {
@BeforeAll
public static void setup() {
- qp = new NouveauQueryParser(new StandardAnalyzer());
+ qp = new NouveauQueryParser(new StandardAnalyzer(), Locale.US);
}
@Test
diff --git a/src/nouveau/src/nouveau_httpd.erl b/src/nouveau/src/nouveau_httpd.erl
index e60d7e440..10917b3d4 100644
--- a/src/nouveau/src/nouveau_httpd.erl
+++ b/src/nouveau/src/nouveau_httpd.erl
@@ -65,6 +65,7 @@ handle_search_req_int(#httpd{method = 'GET', path_parts = [_, _, _, _, IndexName
DbName = couch_db:name(Db),
QueryArgs = validate_query_args(#{
query => chttpd:qs_value(Req, "q"),
+ locale => chttpd:qs_value(Req, "locale"),
partition => chttpd:qs_value(Req, "partition"),
limit => chttpd:qs_value(Req, "limit"),
sort => chttpd:qs_value(Req, "sort"),
@@ -83,6 +84,7 @@ handle_search_req_int(
ReqBody = chttpd:json_body(Req, [return_maps]),
QueryArgs = validate_query_args(#{
query => maps:get(<<"q">>, ReqBody, undefined),
+ locale => maps:get(<<"locale">>, ReqBody, undefined),
partition => chttpd:qs_value(Req, "partition"),
limit => maps:get(<<"limit">>, ReqBody, undefined),
sort => json_or_undefined(<<"sort">>, ReqBody),
@@ -177,6 +179,10 @@ validate_query_arg(query, undefined) ->
throw({query_parse_error, <<"q parameter is mandatory">>});
validate_query_arg(query, Val) when is_list(Val); is_binary(Val) ->
couch_util:to_binary(Val);
+validate_query_arg(locale, undefined) ->
+ null;
+validate_query_arg(locale, Val) when is_list(Val); is_binary(Val) ->
+ couch_util:to_binary(Val);
validate_query_arg(partition, undefined) ->
null;
validate_query_arg(partition, Val) when is_list(Val); is_binary(Val) ->