|
14 | 14 | package io.trino.execution;
|
15 | 15 |
|
16 | 16 | import com.google.inject.Inject;
|
| 17 | +import info.debatty.java.stringsimilarity.JaroWinkler; |
| 18 | +import info.debatty.java.stringsimilarity.interfaces.StringSimilarity; |
17 | 19 | import io.trino.Session;
|
18 | 20 | import io.trino.metadata.SessionPropertyManager;
|
19 | 21 | import io.trino.security.AccessControl;
|
|
28 | 30 | import io.trino.sql.tree.NodeRef;
|
29 | 31 | import io.trino.sql.tree.Parameter;
|
30 | 32 | import io.trino.sql.tree.QualifiedName;
|
31 |
| -import me.xdrop.fuzzywuzzy.FuzzySearch; |
32 | 33 |
|
33 | 34 | import java.util.List;
|
34 | 35 | import java.util.Map;
|
|
44 | 45 | import static io.trino.spi.StandardErrorCode.INVALID_SESSION_PROPERTY;
|
45 | 46 | import static io.trino.sql.analyzer.SemanticExceptions.semanticException;
|
46 | 47 | import static java.lang.String.format;
|
47 |
| -import static java.util.Comparator.comparingInt; |
| 48 | +import static java.util.Comparator.comparingDouble; |
48 | 49 | import static java.util.Objects.requireNonNull;
|
49 | 50 |
|
50 | 51 | public class SessionPropertyEvaluator
|
51 | 52 | {
|
| 53 | + private static final StringSimilarity SIMILARITY = new JaroWinkler(); |
| 54 | + |
52 | 55 | private final PlannerContext plannerContext;
|
53 | 56 | private final AccessControl accessControl;
|
54 | 57 | private final SessionPropertyManager sessionPropertyManager;
|
@@ -120,20 +123,20 @@ public static List<PropertyMetadata<?>> findSimilar(String propertyName, Set<Pro
|
120 | 123 | {
|
121 | 124 | return candidates.stream()
|
122 | 125 | .filter(property -> !property.isHidden())
|
123 |
| - .map(candidate -> new Match(candidate, FuzzySearch.ratio(candidate.getName(), propertyName))) |
124 |
| - .filter(match -> match.ratio() > 75) |
125 |
| - .sorted(comparingInt(Match::ratio).reversed()) |
| 126 | + .map(candidate -> new Match(candidate, SIMILARITY.similarity(candidate.getName(), propertyName))) |
| 127 | + .filter(match -> match.ratio() > 0.85) |
| 128 | + .sorted(comparingDouble(Match::ratio).reversed()) |
126 | 129 | .limit(count)
|
127 | 130 | .map(Match::metadata)
|
128 | 131 | .collect(toImmutableList());
|
129 | 132 | }
|
130 | 133 |
|
131 |
| - private record Match(PropertyMetadata<?> metadata, int ratio) |
| 134 | + private record Match(PropertyMetadata<?> metadata, double ratio) |
132 | 135 | {
|
133 | 136 | public Match
|
134 | 137 | {
|
135 | 138 | requireNonNull(metadata, "metadata is null");
|
136 |
| - verify(ratio >= 0 && ratio < 100, "ratio must be in the [0, 100) range"); |
| 139 | + verify(ratio >= 0.0 && ratio <= 1.0, "ratio must be in the [0, 1.0] range"); |
137 | 140 | }
|
138 | 141 | }
|
139 | 142 |
|
|
0 commit comments