Skip to content

Commit a671329

Browse files
authored
Fix apoc.search.multiSearchReduced UnsupportedOperationException (#936)
1 parent 8275283 commit a671329

2 files changed

Lines changed: 58 additions & 2 deletions

File tree

core/src/main/java/apoc/search/ParallelNodeSearch.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -309,9 +309,9 @@ public static class NodeReducedResult {
309309
public final Map<String, Object> values;
310310

311311
public NodeReducedResult(long id, List<String> labels, Map<String, Object> val) {
312-
this.labels = labels;
313312
this.id = id;
314-
this.values = val;
313+
this.labels = new ArrayList<>(labels);
314+
this.values = new HashMap<>(val);
315315
}
316316
}
317317
}

core/src/test/java/apoc/search/ParallelNodeSearchTest.java

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import apoc.util.TestUtil;
2424
import apoc.util.Util;
2525
import com.neo4j.test.extension.EnterpriseDbmsExtension;
26+
import java.util.Map;
2627
import org.junit.jupiter.api.BeforeAll;
2728
import org.junit.jupiter.api.Test;
2829
import org.neo4j.graphdb.GraphDatabaseService;
@@ -121,4 +122,59 @@ void testMultiSearchNodeNumberExactComparison() {
121122
"call apoc.search.nodeAllReduced({Person: 'born', Movie: ['released']},'exact',2000) yield labels as n return count(n) as c";
122123
TestUtil.testCall(db, query, (row) -> assertEquals(3L, row.get("c")));
123124
}
125+
126+
@Test
127+
void testMultiSearchReduced() {
128+
String query =
129+
"CALL apoc.search.multiSearchReduced('{Person: \"name\",Movie: [\"title\",\"tagline\"]}','CONTAINS','her') YIELD id RETURN count(id) AS c";
130+
TestUtil.testCall(db, query, (row) -> assertEquals(6L, row.get("c")));
131+
query =
132+
"CALL apoc.search.multiSearchReduced('{Person: \"name\",Movie: [\"title\",\"tagline\"]}','STARTS WITH','Tom') YIELD values RETURN count(values) AS c";
133+
TestUtil.testCall(db, query, (row) -> assertEquals(4L, row.get("c")));
134+
query =
135+
"CALL apoc.search.multiSearchReduced('{Person: \"name\",Movie: [\"title\",\"tagline\"]}','ENDS WITH','s') YIELD labels RETURN count(labels) AS c";
136+
TestUtil.testCall(db, query, (row) -> assertEquals(29L, row.get("c")));
137+
}
138+
139+
@Test
140+
void testMultiSearchReducedMergesMultiplePropertyMatches() {
141+
db.executeTransactionally("CREATE (:SearchTest {alpha: 'hello world', beta: 'hello there'})");
142+
try {
143+
TestUtil.testCall(
144+
db,
145+
"CALL apoc.search.multiSearchReduced({SearchTest: ['alpha', 'beta']}, 'contains', 'hello')"
146+
+ " YIELD labels, values RETURN labels, values",
147+
row -> {
148+
assertEquals(java.util.List.of("SearchTest"), row.get("labels"));
149+
@SuppressWarnings("unchecked")
150+
Map<String, Object> values = (Map<String, Object>) row.get("values");
151+
assertEquals(2, values.size());
152+
assertEquals("hello world", values.get("alpha"));
153+
assertEquals("hello there", values.get("beta"));
154+
});
155+
} finally {
156+
db.executeTransactionally("MATCH (n:SearchTest) DELETE n");
157+
}
158+
}
159+
160+
@Test
161+
void testNodeReducedMergesMultiplePropertyMatches() {
162+
db.executeTransactionally("CREATE (:SearchTest {alpha: 'hello world', beta: 'hello there'})");
163+
try {
164+
TestUtil.testCall(
165+
db,
166+
"CALL apoc.search.nodeReduced({SearchTest: ['alpha', 'beta']}, 'contains', 'hello')"
167+
+ " YIELD labels, values RETURN labels, values",
168+
row -> {
169+
assertEquals(java.util.List.of("SearchTest"), row.get("labels"));
170+
@SuppressWarnings("unchecked")
171+
Map<String, Object> values = (Map<String, Object>) row.get("values");
172+
assertEquals(2, values.size());
173+
assertEquals("hello world", values.get("alpha"));
174+
assertEquals("hello there", values.get("beta"));
175+
});
176+
} finally {
177+
db.executeTransactionally("MATCH (n:SearchTest) DELETE n");
178+
}
179+
}
124180
}

0 commit comments

Comments
 (0)