Skip to content

Commit 6191b87

Browse files
Move "parsing" of user input to SimilarityMetric
Co-authored-by: Ioannis Panagiotas <[email protected]>
1 parent d6993c0 commit 6191b87

File tree

4 files changed

+71
-8
lines changed

4 files changed

+71
-8
lines changed

algo/src/main/java/org/neo4j/gds/similarity/knn/KnnNodePropertySpecParser.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@
2828
import java.util.Collections;
2929
import java.util.HashMap;
3030
import java.util.List;
31-
import java.util.Locale;
3231
import java.util.Map;
3332
import java.util.stream.Collectors;
3433

@@ -114,7 +113,7 @@ private static List<KnnNodePropertySpec> fromMap(Map<String, String> userInput)
114113
SimilarityMetric similarityMetric;
115114
if (value != null) {
116115
try {
117-
similarityMetric = SimilarityMetric.valueOf(value.toUpperCase(Locale.ENGLISH));
116+
similarityMetric = SimilarityMetric.parse(value);
118117
knnNodeProperties.add(new KnnNodePropertySpec(key, similarityMetric));
119118
} catch (IllegalArgumentException ex) {
120119
throw new IllegalArgumentException(

algo/src/main/java/org/neo4j/gds/similarity/knn/metrics/SimilarityMetric.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,15 @@
2222
import org.neo4j.gds.api.nodeproperties.ValueType;
2323

2424
import static org.neo4j.gds.utils.StringFormatting.formatWithLocale;
25+
import static org.neo4j.gds.utils.StringFormatting.toUpperCaseWithLocale;
2526

2627
public enum SimilarityMetric {
2728
JACCARD, OVERLAP, COSINE, EUCLIDEAN, PEARSON, LONG_PROPERTY_METRIC, DOUBLE_PROPERTY_METRIC, DEFAULT;
2829

30+
public static SimilarityMetric parse(String value) {
31+
return SimilarityMetric.valueOf(toUpperCaseWithLocale(value));
32+
}
33+
2934
public static SimilarityMetric defaultMetricForType(ValueType valueType) {
3035
switch (valueType) {
3136
case LONG:

algo/src/test/java/org/neo4j/gds/similarity/knn/KnnNodePropertySpecParserTest.java

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,13 @@
2121

2222
import org.junit.jupiter.api.Test;
2323
import org.junit.jupiter.params.ParameterizedTest;
24-
import org.junit.jupiter.params.provider.ValueSource;
24+
import org.junit.jupiter.params.provider.Arguments;
25+
import org.junit.jupiter.params.provider.MethodSource;
2526
import org.neo4j.gds.similarity.knn.metrics.SimilarityMetric;
2627

2728
import java.util.List;
28-
import java.util.Locale;
2929
import java.util.Map;
30+
import java.util.stream.Stream;
3031

3132
import static org.assertj.core.api.Assertions.assertThat;
3233
import static org.assertj.core.api.Assertions.assertThatThrownBy;
@@ -107,13 +108,23 @@ void shouldParseMap() {
107108
}
108109

109110
@ParameterizedTest
110-
@ValueSource(strings = {"cosine", "euCLIDean", "jACcaRd", "OVERLAP", "Pearson"})
111-
void shouldAcceptMetricsRegardlessOfCase(String metric) {
111+
@MethodSource("metrics")
112+
void shouldAcceptMetricsRegardlessOfCase(String metric, SimilarityMetric expectedMetricValue) {
112113
var input = "property";
113114
assertThat(KnnNodePropertySpecParser.parse(Map.of(input, metric)))
114115
.singleElement()
115-
.extracting(spec -> spec.metric().name())
116-
.isEqualTo(metric.toUpperCase(Locale.ENGLISH));
116+
.extracting(KnnNodePropertySpec::metric)
117+
.isEqualTo(expectedMetricValue);
118+
}
119+
120+
public static Stream<Arguments> metrics() {
121+
return Stream.of(
122+
Arguments.of("cosine", SimilarityMetric.COSINE),
123+
Arguments.of("euCLIDean", SimilarityMetric.EUCLIDEAN),
124+
Arguments.of("jACcaRd", SimilarityMetric.JACCARD),
125+
Arguments.of("OVERLAP", SimilarityMetric.OVERLAP),
126+
Arguments.of("Pearson", SimilarityMetric.PEARSON)
127+
);
117128
}
118129

119130
@Test
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
/*
2+
* Copyright (c) "Neo4j"
3+
* Neo4j Sweden AB [http://neo4j.com]
4+
*
5+
* This file is part of Neo4j.
6+
*
7+
* Neo4j is free software: you can redistribute it and/or modify
8+
* it under the terms of the GNU General Public License as published by
9+
* the Free Software Foundation, either version 3 of the License, or
10+
* (at your option) any later version.
11+
*
12+
* This program is distributed in the hope that it will be useful,
13+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
14+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15+
* GNU General Public License for more details.
16+
*
17+
* You should have received a copy of the GNU General Public License
18+
* along with this program. If not, see <http://www.gnu.org/licenses/>.
19+
*/
20+
package org.neo4j.gds.similarity.knn.metrics;
21+
22+
import org.junit.jupiter.params.ParameterizedTest;
23+
import org.junit.jupiter.params.provider.Arguments;
24+
import org.junit.jupiter.params.provider.MethodSource;
25+
26+
import java.util.stream.Stream;
27+
28+
import static org.assertj.core.api.Assertions.assertThat;
29+
30+
class SimilarityMetricTest {
31+
32+
@ParameterizedTest
33+
@MethodSource("metrics")
34+
void parse(String userInput, SimilarityMetric expectedMetric) {
35+
assertThat(SimilarityMetric.parse(userInput)).isEqualTo(expectedMetric);
36+
}
37+
38+
public static Stream<Arguments> metrics() {
39+
return Stream.of(
40+
Arguments.of("JACCARD", SimilarityMetric.JACCARD),
41+
Arguments.of("Jaccard", SimilarityMetric.JACCARD),
42+
Arguments.of("overlap", SimilarityMetric.OVERLAP),
43+
Arguments.of("cosinE", SimilarityMetric.COSINE),
44+
Arguments.of("Euclidean", SimilarityMetric.EUCLIDEAN),
45+
Arguments.of("pearson", SimilarityMetric.PEARSON)
46+
);
47+
}
48+
}

0 commit comments

Comments
 (0)