Skip to content
This repository was archived by the owner on Sep 16, 2024. It is now read-only.

Commit 1efe41a

Browse files
committed
Added URI pattern selector and QueryBatcherBuilder
1 parent 63129a2 commit 1efe41a

File tree

7 files changed

+154
-13
lines changed

7 files changed

+154
-13
lines changed

build.gradle

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ plugins {
77
id "com.github.jk1.dependency-license-report" version "0.3.11"
88
}
99

10-
sourceCompatibility = "1.7"
11-
targetCompatibility = "1.7"
10+
sourceCompatibility = "1.8"
11+
targetCompatibility = "1.8"
1212

1313
repositories {
1414
jcenter()
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package com.marklogic.client.ext.datamovement;
2+
3+
import com.marklogic.client.DatabaseClient;
4+
import com.marklogic.client.datamovement.DataMovementManager;
5+
import com.marklogic.client.datamovement.QueryBatcher;
6+
import com.marklogic.client.query.StructuredQueryDefinition;
7+
8+
/**
9+
* Builds a QueryBatcher based on an array of collection URIs.
10+
*/
11+
public class CollectionsQueryBatcherBuilder implements QueryBatcherBuilder {
12+
13+
private String[] collectionUris;
14+
15+
public CollectionsQueryBatcherBuilder(String... collectionUris) {
16+
this.collectionUris = collectionUris;
17+
}
18+
19+
@Override
20+
public QueryBatcher buildQueryBatcher(DatabaseClient databaseClient, DataMovementManager dataMovementManager) {
21+
StructuredQueryDefinition query = databaseClient.newQueryManager().newStructuredQueryBuilder().collection(collectionUris);
22+
return dataMovementManager.newQueryBatcher(query);
23+
}
24+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package com.marklogic.client.ext.datamovement;
2+
3+
import com.marklogic.client.DatabaseClient;
4+
import com.marklogic.client.datamovement.DataMovementManager;
5+
import com.marklogic.client.datamovement.QueryBatcher;
6+
7+
/**
8+
* Abstracts away how a QueryBatcher is constructed.
9+
*/
10+
public interface QueryBatcherBuilder {
11+
12+
QueryBatcher buildQueryBatcher(DatabaseClient databaseClient, DataMovementManager dataMovementManager);
13+
}

src/main/java/com/marklogic/client/ext/datamovement/QueryBatcherTemplate.java

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ public QueryBatcherTemplate(DatabaseClient databaseClient) {
4040
* @return
4141
*/
4242
public QueryBatcherJobTicket applyOnCollections(QueryBatchListener listener, String... collectionUris) {
43-
return applyOnStructuredQuery(listener, databaseClient.newQueryManager().newStructuredQueryBuilder().collection(collectionUris));
43+
return apply(listener, new CollectionsQueryBatcherBuilder(collectionUris));
4444
}
4545

4646
/**
@@ -51,7 +51,18 @@ public QueryBatcherJobTicket applyOnCollections(QueryBatchListener listener, Str
5151
* @return
5252
*/
5353
public QueryBatcherJobTicket applyOnDocuments(QueryBatchListener listener, String... documentUris) {
54-
return applyOnStructuredQuery(listener, databaseClient.newQueryManager().newStructuredQueryBuilder().document(documentUris));
54+
return apply(listener, new UrisQueryBatcherBuilder(documentUris));
55+
}
56+
57+
/**
58+
* Apply the given listener on batches of documents with URIs matching the given URI pattern.
59+
*
60+
* @param listener
61+
* @param uriPattern
62+
* @return
63+
*/
64+
public QueryBatcherJobTicket applyOnUriPattern(QueryBatchListener listener, String uriPattern) {
65+
return apply(listener, new UriPatternQueryBatcherBuilder(uriPattern));
5566
}
5667

5768
/**
@@ -109,6 +120,18 @@ public QueryBatcherJobTicket applyOnIterator(QueryBatchListener listener, Iterat
109120
return apply(listener, dataMovementManager.newQueryBatcher(uriIterator));
110121
}
111122

123+
/**
124+
* Apply the given listener on batches of documents returning by the QueryBatcher that's constructed by the
125+
* given QueryBatcherBuilder.
126+
*
127+
* @param listener
128+
* @param queryBatcherBuilder
129+
* @return
130+
*/
131+
public QueryBatcherJobTicket apply(QueryBatchListener listener, QueryBatcherBuilder queryBatcherBuilder) {
132+
return apply(listener, queryBatcherBuilder.buildQueryBatcher(databaseClient, dataMovementManager));
133+
}
134+
112135
/**
113136
* Apply the given listener with the given QueryBatcher. The QueryBatcher should have been constructed via the
114137
* DatabaseClient that was used to instantiate this class.
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package com.marklogic.client.ext.datamovement;
2+
3+
import com.marklogic.client.DatabaseClient;
4+
import com.marklogic.client.datamovement.DataMovementManager;
5+
import com.marklogic.client.datamovement.QueryBatcher;
6+
import com.marklogic.client.eval.EvalResult;
7+
8+
import java.util.Iterator;
9+
10+
/**
11+
* Builds a QueryBatcher based on a URI pattern that is fed into cts:uri-match via an eval call.
12+
*/
13+
public class UriPatternQueryBatcherBuilder implements QueryBatcherBuilder {
14+
15+
private String uriPattern;
16+
17+
public UriPatternQueryBatcherBuilder(String uriPattern) {
18+
this.uriPattern = uriPattern;
19+
}
20+
21+
@Override
22+
public QueryBatcher buildQueryBatcher(DatabaseClient databaseClient, DataMovementManager dataMovementManager) {
23+
final Iterator<EvalResult> evalResults = databaseClient.newServerEval().xquery(String.format("cts:uri-match('%s')", uriPattern)).eval().iterator();
24+
Iterator<String> stringIterator = new Iterator<String>() {
25+
@Override
26+
public boolean hasNext() {
27+
return evalResults.hasNext();
28+
}
29+
30+
@Override
31+
public String next() {
32+
return evalResults.next().getString();
33+
}
34+
};
35+
return dataMovementManager.newQueryBatcher(stringIterator);
36+
}
37+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package com.marklogic.client.ext.datamovement;
2+
3+
import com.marklogic.client.DatabaseClient;
4+
import com.marklogic.client.datamovement.DataMovementManager;
5+
import com.marklogic.client.datamovement.QueryBatcher;
6+
import com.marklogic.client.query.StructuredQueryDefinition;
7+
8+
/**
9+
* Builds a QueryBatcher based on an array of document URIs.
10+
*/
11+
public class UrisQueryBatcherBuilder implements QueryBatcherBuilder {
12+
13+
private String[] documentUris;
14+
15+
public UrisQueryBatcherBuilder(String... documentUris) {
16+
this.documentUris = documentUris;
17+
}
18+
19+
@Override
20+
public QueryBatcher buildQueryBatcher(DatabaseClient databaseClient, DataMovementManager dataMovementManager) {
21+
StructuredQueryDefinition query = databaseClient.newQueryManager().newStructuredQueryBuilder().document(documentUris);
22+
return dataMovementManager.newQueryBatcher(query);
23+
}
24+
}

src/test/java/com/marklogic/client/ext/datamovement/listener/ManageCollectionsTest.java

Lines changed: 29 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,33 +17,45 @@ public class ManageCollectionsTest extends AbstractIntegrationTest {
1717

1818
@Test
1919
public void setThenAddThenRemove() {
20+
String firstUri = "dmsdk-test-1.xml";
21+
String secondUri = "dmsdk-test-2.xml";
22+
2023
QueryBatcherTemplate qbt = new QueryBatcherTemplate(newClient("Documents"));
2124

2225
// Clear out the test documents
23-
qbt.applyOnDocuments(new DeleteListener(), "1.xml", "2.xml");
26+
qbt.applyOnDocuments(new DeleteListener(), firstUri, secondUri);
2427

2528
// Insert documents
2629
RestBatchWriter writer = new RestBatchWriter(client, false);
2730
writer.write(Arrays.asList(
28-
new SimpleDocumentWriteOperation("1.xml", "<one/>", COLLECTION),
29-
new SimpleDocumentWriteOperation("2.xml", "<two/>", COLLECTION)
31+
new SimpleDocumentWriteOperation(firstUri, "<one/>", COLLECTION),
32+
new SimpleDocumentWriteOperation(secondUri, "<two/>", COLLECTION)
3033
));
3134
writer.waitForCompletion();
3235

3336
// Set collections
3437
qbt.applyOnCollections(new SetCollectionsListener(COLLECTION, "red"), COLLECTION);
35-
assertUriInCollections("1.xml", COLLECTION, "red");
36-
assertUriInCollections("2.xml", COLLECTION, "red");
38+
assertUriInCollections(firstUri, COLLECTION, "red");
39+
assertUriInCollections(secondUri, COLLECTION, "red");
3740

3841
// Add collections
3942
qbt.applyOnCollections(new AddCollectionsListener("blue", "green"), COLLECTION);
40-
assertUriInCollections("1.xml", COLLECTION, "red", "blue", "green");
41-
assertUriInCollections("2.xml", COLLECTION, "red", "blue", "green");
43+
assertUriInCollections(firstUri, COLLECTION, "red", "blue", "green");
44+
assertUriInCollections(secondUri, COLLECTION, "red", "blue", "green");
4245

4346
// Remove collections
4447
qbt.applyOnCollections(new RemoveCollectionsListener("red", "blue", "green"), COLLECTION);
45-
assertUriInCollections("1.xml", COLLECTION);
46-
assertUriInCollections("2.xml", COLLECTION);
48+
assertUriInCollections(firstUri, COLLECTION);
49+
assertUriInCollections(secondUri, COLLECTION);
50+
51+
// Set via URI pattern!
52+
qbt.applyOnUriPattern(new SetCollectionsListener(COLLECTION, "red"), "dmsdk-test-*.xml");
53+
assertUriInCollections(firstUri, COLLECTION, "red");
54+
assertUriInCollections(secondUri, COLLECTION, "red");
55+
56+
qbt.applyOnUriPattern(new RemoveCollectionsListener("red"), "dmsdk-test-2*");
57+
assertUriInCollections(firstUri, COLLECTION, "red");
58+
assertUriNotInCollections(secondUri, "red");
4759
}
4860

4961
private void assertUriInCollections(String uri, String... collections) {
@@ -54,4 +66,12 @@ private void assertUriInCollections(String uri, String... collections) {
5466
}
5567
assertEquals(collections.length, list.size());
5668
}
69+
70+
private void assertUriNotInCollections(String uri, String... collections) {
71+
ClientHelper clientHelper = new ClientHelper(client);
72+
List<String> list = clientHelper.getCollections(uri);
73+
for (String coll : collections) {
74+
assertFalse(list.contains(coll));
75+
}
76+
}
5777
}

0 commit comments

Comments
 (0)