diff --git a/pom.xml b/pom.xml
index 579e667e3..155afe513 100644
--- a/pom.xml
+++ b/pom.xml
@@ -56,31 +56,8 @@
true
-
-
- true
-
-
- false
-
- central
- https://jcenter.bintray.com
-
-
-
-
- false
-
-
- true
-
- central
- https://jcenter.bintray.com
-
-
-
UTF-8
UTF-8
@@ -102,6 +79,11 @@
graphql-java
16.2
+
+ org.webjars.npm
+ n1ru4l__push-pull-async-iterable-iterator
+ 2.1.2
+
@@ -179,7 +161,7 @@
org.webjars.npm
graphiql
- 1.4.1
+ 1.4.2
diff --git a/src/main/java/com/jaeksoft/opensearchserver/GraphQLFunctions.java b/src/main/java/com/jaeksoft/opensearchserver/GraphQLFunctions.java
index ac90e5437..2382d69e5 100644
--- a/src/main/java/com/jaeksoft/opensearchserver/GraphQLFunctions.java
+++ b/src/main/java/com/jaeksoft/opensearchserver/GraphQLFunctions.java
@@ -19,10 +19,25 @@
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.MapSerializer;
import com.qwazr.search.analysis.SmartAnalyzerSet;
+import com.qwazr.search.field.FieldDefinition;
import com.qwazr.search.field.SmartFieldDefinition;
import com.qwazr.search.index.IndexServiceInterface;
+import com.qwazr.search.index.IndexSettingsDefinition;
import com.qwazr.search.index.PostDefinition;
+import com.qwazr.search.index.QueryBuilder;
+import com.qwazr.search.index.QueryDefinition;
+import com.qwazr.search.index.ResultDefinition;
+import com.qwazr.search.index.ResultDocumentMap;
+import com.qwazr.search.query.AbstractClassicQueryParser;
+import com.qwazr.search.query.AbstractQueryParser;
+import com.qwazr.search.query.MultiFieldQueryParser;
+import com.qwazr.search.query.QueryInterface;
+import com.qwazr.search.query.QueryParser;
+import com.qwazr.search.query.QueryParserOperator;
+import com.qwazr.search.query.SimpleQueryParser;
import static graphql.Scalars.GraphQLFloat;
import static graphql.Scalars.GraphQLInt;
import static graphql.Scalars.GraphQLString;
@@ -81,10 +96,16 @@ List getIndexes(final DataFetchingEnvironment environment) {
Boolean createIndex(final DataFetchingEnvironment environment) {
final String name = getStringArgument(environment, "indexName");
- if (name == null)
+ if (name == null || name.isEmpty() || name.isBlank())
return false;
+ final String indexName = name.trim();
+ final IndexSettingsDefinition indexSettings = IndexSettingsDefinition
+ .of()
+ .primaryKey("")
+ .recordField(FieldDefinition.RECORD_FIELD)
+ .build();
graphQlService.refreshSchema(() -> {
- indexService.createUpdateIndex(name.trim());
+ indexService.createUpdateIndex(indexName, indexSettings);
return true;
});
return true;
@@ -187,6 +208,89 @@ Integer ingestDocuments(final String indexName, final DataFetchingEnvironment en
return indexService.postMappedDocuments(indexName, PostDefinition.Documents.of(list, null));
}
+ private QueryResult search(final String indexName, final QueryInterface queryInterface, final DataFetchingEnvironment environment) {
+ final QueryBuilder queryDefinitionBuilder = QueryDefinition.of(queryInterface)
+ .start(environment.getArgument("start"))
+ .rows(environment.getArgument("rows"));
+ final List returnedFields = environment.getArgument("returnedFields");
+ if (returnedFields == null || returnedFields.isEmpty()) {
+ queryDefinitionBuilder.returnedFields("*");
+ } else {
+ queryDefinitionBuilder.returnedFields(returnedFields);
+ }
+ final ResultDefinition.WithMap result = indexService.searchQuery(indexName, queryDefinitionBuilder.build(), false);
+ return new QueryResult(result);
+ }
+
+ private void commonQueryParserParameters(final Map params, final AbstractQueryParser.AbstractBuilder builder) {
+ builder
+ .setEnableGraphQueries((Boolean) params.get("enableGraphQueries"))
+ .setEnablePositionIncrements((Boolean) params.get("enablePositionIncrements"))
+ .setAutoGenerateMultiTermSynonymsPhraseQuery((Boolean) params.get("autoGenerateMultiTermSynonymsPhraseQuery"))
+ .setQueryString((String) params.get("queryString"));
+ ;
+
+ }
+
+ private QueryParserOperator getDefaultOperator(final Map params) {
+ final String defaultOperator = (String) params.get("defaultOperator");
+ return defaultOperator == null ? null : QueryParserOperator.valueOf(defaultOperator);
+ }
+
+ private void commonClassicQueryParserParameters(final Map params, final AbstractClassicQueryParser.AbstractParserBuilder builder) {
+ commonQueryParserParameters(params, builder);
+
+ builder
+ .setAllowLeadingWildcard((Boolean) params.get("allowLeadingWildcard"))
+ .setAutoGeneratePhraseQuery((Boolean) params.get("autoGeneratePhraseQuery"))
+ .setFuzzyMinSim((Float) params.get("fuzzyMinSim"))
+ .setFuzzyPrefixLength((Integer) params.get("fuzzyPrefixLength"))
+ .setSplitOnWhitespace((Boolean) params.get("splitOnWhitespace"))
+ .setMaxDeterminizedStates((Integer) params.get("maxDeterminizedStates"))
+ .setDefaultOperator(getDefaultOperator(params))
+ .setPhraseSlop((Integer) params.get("phraseSlop"));
+ }
+
+ QueryResult searchWithMultiFieldQueryParser(final String indexName, final DataFetchingEnvironment environment) {
+ final MultiFieldQueryParser.Builder builder = MultiFieldQueryParser.of();
+ final Map params = environment.getArgument("params");
+ commonClassicQueryParserParameters(params, builder);
+ final Map fieldBoostMap = environment.getArgument("fieldBoost");
+ if (fieldBoostMap != null) {
+ fieldBoostMap.forEach((field, boost) -> builder.addBoost(field, boost.floatValue()));
+ }
+ return search(indexName, builder.build(), environment);
+ }
+
+ QueryResult searchWithStandardQueryParser(final String indexName, final DataFetchingEnvironment environment) {
+ final QueryParser.Builder builder = QueryParser.of(environment.getArgument("defaultField"));
+ final Map params = environment.getArgument("params");
+ commonQueryParserParameters(params, builder);
+ return search(indexName, builder.build(), environment);
+ }
+
+ QueryResult searchWithSimpleQueryParser(final String indexName, final DataFetchingEnvironment environment) {
+ final SimpleQueryParser.Builder builder = SimpleQueryParser.of();
+ final Map params = environment.getArgument("params");
+ commonQueryParserParameters(params, builder);
+ final List