Skip to content

Commit

Permalink
Fix infinite recursion in SimilarityMeasure (#19)
Browse files Browse the repository at this point in the history
* Add test case and bug fix

* Add UnknownSimilarityMeasure class
  • Loading branch information
SvenLehmann authored Jul 30, 2019
1 parent 1c4eb25 commit bf0734b
Show file tree
Hide file tree
Showing 3 changed files with 51 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -90,4 +90,38 @@ void shouldCalculateSimilarityStableMatchesWithAdditionalWomen() {
/ 5, offset(1e-4d)
);
}

@Test
void shouldHandleLeftNullValue() {
final List<String> men = Arrays.asList("aaa", "ddd", "bbb", "ccc");

final SimilarityMeasure<List<String>> stableMatching =
new MatchingSimilarity<>(new WeaklyStableMarriage<>(), levenshtein());

final double sim =
stableMatching.getSimilarity(null, men, SimilarityContext.builder().build());
assertThat(sim).isEqualTo(SimilarityMeasure.unknown());
}

@Test
void shouldHandleRightNullValue() {
final List<String> men = Arrays.asList("aaa", "ddd", "bbb", "ccc");

final SimilarityMeasure<List<String>> stableMatching =
new MatchingSimilarity<>(new WeaklyStableMarriage<>(), levenshtein());

final double sim =
stableMatching.getSimilarity(men, null, SimilarityContext.builder().build());
assertThat(sim).isEqualTo(SimilarityMeasure.unknown());
}

@Test
void shouldHandleTwoNullValue() {
final SimilarityMeasure<List<String>> stableMatching =
new MatchingSimilarity<>(new WeaklyStableMarriage<>(), levenshtein());

final double sim =
stableMatching.getSimilarity(null, null, SimilarityContext.builder().build());
assertThat(sim).isEqualTo(SimilarityMeasure.unknown());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ public class SimilarityContext {
*/
@Builder.Default
@NonNull
SimilarityMeasure<Object> similarityMeasureForNull = (left, right, context) -> SimilarityMeasure.unknown();
SimilarityMeasure<Object> similarityMeasureForNull = new UnknownSimilarityMeasure<>();

/**
* Calculates the similarity when any of the two values under comparison is null.
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.bakdata.dedupe.similarity;

import lombok.NonNull;

class UnknownSimilarityMeasure<T> implements SimilarityMeasure<T> {
@Override
public double getSimilarity(final Object left, final Object right, final @NonNull SimilarityContext context) {
return SimilarityMeasure.unknown();
}

@Override
public double getNonNullSimilarity(final @NonNull Object left, final @NonNull Object right,
final @NonNull SimilarityContext context) {
return SimilarityMeasure.unknown();
}
}

0 comments on commit bf0734b

Please sign in to comment.