Skip to content

Commit a8069d1

Browse files
authored
Fix search anoymizer only (opensearch-project#4783)
* fix anoymizer for search command Signed-off-by: xinyual <xinyual@amazon.com> * pushdown match when only one equal in search command Signed-off-by: xinyual <xinyual@amazon.com> * fix regex case Signed-off-by: xinyual <xinyual@amazon.com> * fix UT Signed-off-by: xinyual <xinyual@amazon.com> * fix UT Signed-off-by: xinyual <xinyual@amazon.com> * revert match change Signed-off-by: xinyual <xinyual@amazon.com> * fix UT by ignore the expression Signed-off-by: xinyual <xinyual@amazon.com> * remove useless change and resolve comment Signed-off-by: xinyual <xinyual@amazon.com> * remove useless change and resolve comment Signed-off-by: xinyual <xinyual@amazon.com> * add test cases for metadata and timestamp identifier Signed-off-by: xinyual <xinyual@amazon.com> * change name Signed-off-by: xinyual <xinyual@amazon.com> --------- Signed-off-by: xinyual <xinyual@amazon.com>
1 parent f005865 commit a8069d1

File tree

15 files changed

+134
-19
lines changed

15 files changed

+134
-19
lines changed

core/src/main/java/org/opensearch/sql/ast/dsl/AstDSL.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ public UnresolvedPlan describe(String tableName) {
113113
}
114114

115115
public static UnresolvedPlan search(UnresolvedPlan input, String queryString) {
116-
return new Search(input, queryString);
116+
return new Search(input, queryString, null);
117117
}
118118

119119
public UnresolvedPlan subqueryAlias(UnresolvedPlan child, String alias) {

core/src/main/java/org/opensearch/sql/ast/expression/SearchAnd.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,11 @@ public String toQueryString() {
2727
return left.toQueryString() + " AND " + right.toQueryString();
2828
}
2929

30+
@Override
31+
public String toAnonymizedString() {
32+
return left.toAnonymizedString() + " AND " + right.toAnonymizedString();
33+
}
34+
3035
@Override
3136
public List<? extends UnresolvedExpression> getChild() {
3237
return Arrays.asList(left, right);

core/src/main/java/org/opensearch/sql/ast/expression/SearchComparison.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55

66
package org.opensearch.sql.ast.expression;
77

8+
import static org.opensearch.sql.utils.QueryStringUtils.maskField;
9+
810
import java.util.Arrays;
911
import java.util.List;
1012
import lombok.EqualsAndHashCode;
@@ -63,6 +65,12 @@ public String toQueryString() {
6365
}
6466
}
6567

68+
@Override
69+
public String toAnonymizedString() {
70+
String fieldName = QueryStringUtils.escapeFieldName(field.getField().toString());
71+
return maskField(fieldName) + " " + operator.symbol + " ***";
72+
}
73+
6674
@Override
6775
public List<? extends UnresolvedExpression> getChild() {
6876
return Arrays.asList(field, value);

core/src/main/java/org/opensearch/sql/ast/expression/SearchExpression.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,13 @@ public abstract class SearchExpression extends UnresolvedExpression {
1717
*/
1818
public abstract String toQueryString();
1919

20+
/**
21+
* Convert the search expression to anonymized string
22+
*
23+
* @return the anonymized string
24+
*/
25+
public abstract String toAnonymizedString();
26+
2027
@Override
2128
public <R, C> R accept(AbstractNodeVisitor<R, C> nodeVisitor, C context) {
2229
return nodeVisitor.visitChildren(this, context);

core/src/main/java/org/opensearch/sql/ast/expression/SearchGroup.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,14 @@ public String toQueryString() {
2626
return "(" + expression.toQueryString() + ")";
2727
}
2828

29+
@Override
30+
public String toAnonymizedString() {
31+
if (expression instanceof SearchGroup) {
32+
return expression.toAnonymizedString();
33+
}
34+
return "(" + expression.toAnonymizedString() + ")";
35+
}
36+
2937
@Override
3038
public List<? extends UnresolvedExpression> getChild() {
3139
return Collections.singletonList(expression);

core/src/main/java/org/opensearch/sql/ast/expression/SearchIn.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,11 @@ public String toQueryString() {
3333
return fieldName + ":( " + valueList + " )";
3434
}
3535

36+
@Override
37+
public String toAnonymizedString() {
38+
return "identifier IN ***";
39+
}
40+
3641
@Override
3742
public List<? extends UnresolvedExpression> getChild() {
3843
List<UnresolvedExpression> children = new ArrayList<>();

core/src/main/java/org/opensearch/sql/ast/expression/SearchLiteral.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,11 @@ public String toQueryString() {
5555
return QueryStringUtils.escapeLuceneSpecialCharacters(text);
5656
}
5757

58+
@Override
59+
public String toAnonymizedString() {
60+
return "***";
61+
}
62+
5863
@Override
5964
public List<? extends UnresolvedExpression> getChild() {
6065
return Collections.singletonList(literal);

core/src/main/java/org/opensearch/sql/ast/expression/SearchNot.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,11 @@ public String toQueryString() {
2626
return "NOT(" + expression.toQueryString() + ")";
2727
}
2828

29+
@Override
30+
public String toAnonymizedString() {
31+
return "NOT(" + expression.toAnonymizedString() + ")";
32+
}
33+
2934
@Override
3035
public List<? extends UnresolvedExpression> getChild() {
3136
return Collections.singletonList(expression);

core/src/main/java/org/opensearch/sql/ast/expression/SearchOr.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,11 @@ public String toQueryString() {
2727
return left.toQueryString() + " OR " + right.toQueryString();
2828
}
2929

30+
@Override
31+
public String toAnonymizedString() {
32+
return left.toAnonymizedString() + " OR " + right.toAnonymizedString();
33+
}
34+
3035
@Override
3136
public List<? extends UnresolvedExpression> getChild() {
3237
return Arrays.asList(left, right);

core/src/main/java/org/opensearch/sql/ast/tree/Search.java

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,24 +7,33 @@
77

88
import com.google.common.collect.ImmutableList;
99
import java.util.List;
10+
import javax.annotation.Nullable;
1011
import lombok.EqualsAndHashCode;
1112
import lombok.Getter;
1213
import lombok.RequiredArgsConstructor;
1314
import lombok.ToString;
1415
import org.opensearch.sql.ast.AbstractNodeVisitor;
16+
import org.opensearch.sql.ast.expression.SearchExpression;
1517

1618
/**
1719
* Logical plan node for Search operation. Represents search expressions that get converted to
1820
* query_string function.
1921
*/
2022
@Getter
2123
@ToString
22-
@EqualsAndHashCode(callSuper = false)
24+
@EqualsAndHashCode(onlyExplicitlyIncluded = true, callSuper = false)
2325
@RequiredArgsConstructor
2426
public class Search extends UnresolvedPlan {
2527

26-
private final UnresolvedPlan child;
27-
private final String queryString;
28+
@EqualsAndHashCode.Include private final UnresolvedPlan child;
29+
@EqualsAndHashCode.Include private final String queryString;
30+
31+
// Currently it's only for anonymizer
32+
private final @Nullable SearchExpression originalExpression;
33+
34+
public Search(UnresolvedPlan child, String queryString) {
35+
this(child, queryString, null);
36+
}
2837

2938
@Override
3039
public List<UnresolvedPlan> getChild() {
@@ -38,6 +47,6 @@ public <T, C> T accept(AbstractNodeVisitor<T, C> nodeVisitor, C context) {
3847

3948
@Override
4049
public UnresolvedPlan attach(UnresolvedPlan child) {
41-
return new Search(child, queryString);
50+
return new Search(child, queryString, originalExpression);
4251
}
4352
}

0 commit comments

Comments
 (0)