Skip to content

Commit 2460b7a

Browse files
committed
MLE-26460 Refactor: Cleaning up usage of QueryConfig
Made QueryConfig into a record so it's immutable, making it easier to understand. And passing it to the constructor of QueryBatcherImpl instead of having 6 separate args.
1 parent 408406c commit 2460b7a

File tree

4 files changed

+95
-92
lines changed

4 files changed

+95
-92
lines changed

marklogic-client-api/src/main/java/com/marklogic/client/datamovement/impl/DataMovementManagerImpl.java

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55

66
import com.marklogic.client.DatabaseClient;
77
import com.marklogic.client.DatabaseClientBuilder;
8-
import com.marklogic.client.DatabaseClientFactory;
98
import com.marklogic.client.datamovement.*;
109
import com.marklogic.client.impl.DatabaseClientImpl;
1110
import com.marklogic.client.io.marker.ContentHandle;
@@ -123,10 +122,8 @@ private QueryBatcher newQueryBatcherImpl(SearchQueryDefinition query) {
123122
QueryBatcherImpl queryBatcher = null;
124123
// preprocess the query if the effective version is at least 10.0-5
125124
if (Long.compareUnsigned(getServerVersion(), Long.parseUnsignedLong("10000500")) >= 0) {
126-
DataMovementServices.QueryConfig queryConfig = service.initConfig("POST", query);
127-
queryBatcher = new QueryBatcherImpl(query, this, queryConfig.forestConfig,
128-
queryConfig.serializedCtsQuery, queryConfig.filtered,
129-
queryConfig.maxDocToUriBatchRatio, queryConfig.defaultDocBatchSize, queryConfig.maxUriBatchSize);
125+
QueryConfig queryConfig = service.initConfig("POST", query);
126+
queryBatcher = new QueryBatcherImpl(query, this, queryConfig);
130127
} else {
131128
queryBatcher = new QueryBatcherImpl(query, this, getForestConfig());
132129
}

marklogic-client-api/src/main/java/com/marklogic/client/datamovement/impl/DataMovementServices.java

Lines changed: 52 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -36,59 +36,58 @@ public DataMovementServices setClient(DatabaseClient client) {
3636
return this;
3737
}
3838

39-
QueryConfig initConfig(String method, SearchQueryDefinition qdef) {
40-
logger.debug("initializing forest configuration with query");
41-
if (qdef == null) throw new IllegalArgumentException("null query definition");
42-
43-
JsonNode result = ((DatabaseClientImpl) this.client).getServices()
44-
.forestInfo(null, method, new RequestParameters(), qdef, new JacksonHandle())
45-
.get();
46-
// System.out.println(result.toPrettyString());
47-
48-
QueryConfig queryConfig = new QueryConfig();
49-
50-
try {
51-
ObjectMapper mapper = new ObjectMapper();
52-
JsonNode queryResult = result.get("query");
53-
if (queryResult != null && queryResult.isObject() && queryResult.has("ctsquery")) {
54-
queryConfig.serializedCtsQuery = mapper.writeValueAsString(queryResult);
55-
logger.debug("initialized query to: {}", queryConfig.serializedCtsQuery);
56-
}
57-
JsonNode filteredResult = result.get("filtered");
58-
if (filteredResult != null && filteredResult.isBoolean()) {
59-
queryConfig.filtered = filteredResult.asBoolean();
60-
logger.debug("initialized filtering to: {}", queryConfig.filtered.toString());
61-
}
62-
JsonNode maxDocToUriBatchRatio = result.get("maxDocToUriBatchRatio");
63-
if (maxDocToUriBatchRatio != null && maxDocToUriBatchRatio.isInt()) {
64-
queryConfig.maxDocToUriBatchRatio = maxDocToUriBatchRatio.asInt();
65-
logger.debug("initialized maxDocToUriBatchRatio to : {}", queryConfig.maxDocToUriBatchRatio);
66-
} else {
67-
queryConfig.maxDocToUriBatchRatio = -1;
68-
}
69-
JsonNode defaultDocBatchSize = result.get("defaultDocBatchSize");
70-
if (defaultDocBatchSize != null && defaultDocBatchSize.isInt()) {
71-
queryConfig.defaultDocBatchSize = defaultDocBatchSize.asInt();
72-
logger.debug("initialized defaultDocBatchSize to : {}", queryConfig.defaultDocBatchSize);
73-
} else {
74-
queryConfig.defaultDocBatchSize = -1;
75-
}
76-
JsonNode maxUriBatchSize = result.get("maxUriBatchSize");
77-
if (maxUriBatchSize != null && maxUriBatchSize.isInt()) {
78-
queryConfig.maxUriBatchSize = maxUriBatchSize.asInt();
79-
logger.debug("initialized maxUriBatchSize to : {}", queryConfig.maxUriBatchSize);
80-
} else {
81-
queryConfig.maxUriBatchSize = -1;
82-
}
83-
84-
} catch (JsonProcessingException e) {
85-
logger.error("failed to initialize query", e);
86-
}
87-
88-
queryConfig.forestConfig = makeForestConfig(result.has("forests") ? result.get("forests") : result);
89-
90-
return queryConfig;
91-
}
39+
QueryConfig initConfig(String method, SearchQueryDefinition qdef) {
40+
logger.debug("initializing forest configuration with query");
41+
if (qdef == null) throw new IllegalArgumentException("null query definition");
42+
43+
JsonNode result = ((DatabaseClientImpl) this.client).getServices()
44+
.forestInfo(null, method, new RequestParameters(), qdef, new JacksonHandle())
45+
.get();
46+
47+
JsonNode queryResult = result.get("query");
48+
49+
String serializedCtsQuery = null;
50+
if (queryResult != null && queryResult.isObject() && queryResult.has("ctsquery")) {
51+
try {
52+
serializedCtsQuery = new ObjectMapper().writeValueAsString(queryResult);
53+
logger.debug("initialized query to: {}", serializedCtsQuery);
54+
} catch (JsonProcessingException e) {
55+
logger.warn("Unable to serialize query result while initializing QueryBatcher; cause: {}", e.getMessage());
56+
}
57+
}
58+
59+
JsonNode filteredResult = result.get("filtered");
60+
Boolean filtered = null;
61+
if (filteredResult != null && filteredResult.isBoolean()) {
62+
filtered = filteredResult.asBoolean();
63+
logger.debug("initialized filtering to: {}", filtered);
64+
}
65+
66+
JsonNode maxDocToUriBatchRatioNode = result.get("maxDocToUriBatchRatio");
67+
int maxDocToUriBatchRatio = -1;
68+
if (maxDocToUriBatchRatioNode != null && maxDocToUriBatchRatioNode.isInt()) {
69+
maxDocToUriBatchRatio = maxDocToUriBatchRatioNode.asInt();
70+
logger.debug("initialized maxDocToUriBatchRatio to : {}", maxDocToUriBatchRatio);
71+
}
72+
73+
JsonNode defaultDocBatchSizeNode = result.get("defaultDocBatchSize");
74+
int defaultDocBatchSize = -1;
75+
if (defaultDocBatchSizeNode != null && defaultDocBatchSizeNode.isInt()) {
76+
defaultDocBatchSize = defaultDocBatchSizeNode.asInt();
77+
logger.debug("initialized defaultDocBatchSize to : {}", defaultDocBatchSize);
78+
}
79+
80+
JsonNode maxUriBatchSizeNode = result.get("maxUriBatchSize");
81+
int maxUriBatchSize = -1;
82+
if (maxUriBatchSizeNode != null && maxUriBatchSizeNode.isInt()) {
83+
maxUriBatchSize = maxUriBatchSizeNode.asInt();
84+
logger.debug("initialized maxUriBatchSize to : {}", maxUriBatchSize);
85+
}
86+
87+
ForestConfiguration forestConfig = makeForestConfig(result.has("forests") ? result.get("forests") : result);
88+
return new QueryConfig(serializedCtsQuery, forestConfig, filtered,
89+
maxDocToUriBatchRatio, defaultDocBatchSize, maxUriBatchSize);
90+
}
9291

9392
ForestConfigurationImpl readForestConfig() {
9493
logger.debug("initializing forest configuration");
@@ -183,12 +182,4 @@ private String generateJobId() {
183182
return UUID.randomUUID().toString();
184183
}
185184

186-
static class QueryConfig {
187-
String serializedCtsQuery;
188-
ForestConfiguration forestConfig;
189-
Boolean filtered;
190-
int maxDocToUriBatchRatio;
191-
int defaultDocBatchSize;
192-
int maxUriBatchSize;
193-
}
194185
}

marklogic-client-api/src/main/java/com/marklogic/client/datamovement/impl/QueryBatcherImpl.java

Lines changed: 25 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -65,47 +65,46 @@ public class QueryBatcherImpl extends BatcherImpl implements QueryBatcher {
6565
private final Object lock = new Object();
6666
private final Map<Forest,List<QueryTask>> blackListedTasks = new HashMap<>();
6767
private boolean isSingleThreaded = false;
68+
6869
private long maxUris = Long.MAX_VALUE;
6970
private long maxBatches = Long.MAX_VALUE;
7071
private int maxDocToUriBatchRatio;
7172
private int docToUriBatchRatio;
7273
private int defaultDocBatchSize;
7374
private int maxUriBatchSize;
7475

75-
QueryBatcherImpl(
76-
SearchQueryDefinition originalQuery, DataMovementManager moveMgr, ForestConfiguration forestConfig,
77-
String serializedCtsQuery, Boolean filtered, int maxDocToUriBatchRatio, int defaultDocBatchSize, int maxUriBatchSize
78-
) {
79-
this(moveMgr, forestConfig, maxDocToUriBatchRatio, defaultDocBatchSize, maxUriBatchSize);
80-
// TODO: skip conversion in DataMovementManagerImpl.newQueryBatcherImpl() unless canSerializeQueryAsJSON()
81-
if (serializedCtsQuery != null && serializedCtsQuery.length() > 0 &&
82-
originalQuery instanceof AbstractSearchQueryDefinition &&
83-
((AbstractSearchQueryDefinition) originalQuery).canSerializeQueryAsJSON()) {
84-
QueryManagerImpl queryMgr = (QueryManagerImpl) getPrimaryClient().newQueryManager();
85-
this.queryMethod = "POST";
86-
this.query = queryMgr.newRawCtsQueryDefinition(new StringHandle(serializedCtsQuery).withFormat(Format.JSON));
87-
this.originalQuery = originalQuery;
88-
if (filtered != null) {
89-
this.filtered = filtered;
90-
}
91-
} else {
92-
initQuery(originalQuery);
93-
}
94-
}
76+
QueryBatcherImpl(SearchQueryDefinition originalQuery, DataMovementManager moveMgr, QueryConfig queryConfig) {
77+
this(moveMgr, queryConfig);
78+
79+
final String serializedCtsQuery = queryConfig.serializedCtsQuery();
80+
if (serializedCtsQuery != null && serializedCtsQuery.length() > 0 &&
81+
originalQuery instanceof AbstractSearchQueryDefinition &&
82+
((AbstractSearchQueryDefinition) originalQuery).canSerializeQueryAsJSON()) {
83+
QueryManagerImpl queryMgr = (QueryManagerImpl) getPrimaryClient().newQueryManager();
84+
this.queryMethod = "POST";
85+
this.query = queryMgr.newRawCtsQueryDefinition(new StringHandle(serializedCtsQuery).withFormat(Format.JSON));
86+
this.originalQuery = originalQuery;
87+
this.filtered = queryConfig.filtered();
88+
} else {
89+
initQuery(originalQuery);
90+
}
91+
}
92+
9593
public QueryBatcherImpl(SearchQueryDefinition query, DataMovementManager moveMgr, ForestConfiguration forestConfig) {
9694
this(moveMgr, forestConfig);
9795
initQuery(query);
9896
}
97+
9998
public QueryBatcherImpl(Iterator<String> iterator, DataMovementManager moveMgr, ForestConfiguration forestConfig) {
10099
this(moveMgr, forestConfig);
101100
this.iterator = iterator;
102101
}
103-
private QueryBatcherImpl(DataMovementManager moveMgr, ForestConfiguration forestConfig,
104-
int maxDocToUriBatchRatio, int defaultDocBatchSize, int maxUriBatchSize) {
105-
this(moveMgr, forestConfig);
106-
this.maxDocToUriBatchRatio = maxDocToUriBatchRatio;
107-
this.defaultDocBatchSize = defaultDocBatchSize;
108-
this.maxUriBatchSize = maxUriBatchSize;
102+
103+
private QueryBatcherImpl(DataMovementManager moveMgr, QueryConfig queryConfig) {
104+
this(moveMgr, queryConfig.forestConfig());
105+
this.maxDocToUriBatchRatio = queryConfig.maxDocToUriBatchRatio();
106+
this.defaultDocBatchSize = queryConfig.defaultDocBatchSize();
107+
this.maxUriBatchSize = queryConfig.maxUriBatchSize();
109108
withBatchSize(defaultDocBatchSize);
110109
}
111110
private QueryBatcherImpl(DataMovementManager moveMgr, ForestConfiguration forestConfig) {
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
/*
2+
* Copyright (c) 2010-2026 Progress Software Corporation and/or its subsidiaries or affiliates. All Rights Reserved.
3+
*/
4+
package com.marklogic.client.datamovement.impl;
5+
6+
import com.marklogic.client.datamovement.ForestConfiguration;
7+
8+
record QueryConfig(
9+
String serializedCtsQuery,
10+
ForestConfiguration forestConfig,
11+
Boolean filtered,
12+
int maxDocToUriBatchRatio,
13+
int defaultDocBatchSize,
14+
int maxUriBatchSize
15+
) {
16+
}

0 commit comments

Comments
 (0)