Skip to content

Commit 3e008b5

Browse files
committed
anonymizer - add rex for anonymizer and test
Signed-off-by: Jialiang Liang <jiallian@amazon.com>
1 parent edaedee commit 3e008b5

2 files changed

Lines changed: 64 additions & 0 deletions

File tree

ppl/src/main/java/org/opensearch/sql/ppl/utils/PPLQueryDataAnonymizer.java

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@
7676
import org.opensearch.sql.ast.tree.Relation;
7777
import org.opensearch.sql.ast.tree.Rename;
7878
import org.opensearch.sql.ast.tree.Reverse;
79+
import org.opensearch.sql.ast.tree.Rex;
7980
import org.opensearch.sql.ast.tree.Sort;
8081
import org.opensearch.sql.ast.tree.SpanBin;
8182
import org.opensearch.sql.ast.tree.SubqueryAlias;
@@ -419,6 +420,32 @@ public String visitReverse(Reverse node, String context) {
419420
return StringUtils.format("%s | reverse", child);
420421
}
421422

423+
@Override
424+
public String visitRex(Rex node, String context) {
425+
String child = node.getChild().get(0).accept(this, context);
426+
String field = visitExpression(node.getField());
427+
String pattern = "\"" + node.getPattern().toString() + "\"";
428+
StringBuilder command = new StringBuilder();
429+
430+
// Build the base command
431+
if (node.getMode() == Rex.RexMode.SED) {
432+
command.append(String.format("%s | rex field=%s mode=sed %s", child, field, pattern));
433+
} else {
434+
command.append(String.format("%s | rex field=%s %s", child, field, pattern));
435+
}
436+
437+
// Add optional parameters
438+
if (node.getMaxMatch().isPresent()) {
439+
command.append(" max_match=").append(node.getMaxMatch().get());
440+
}
441+
442+
if (node.getOffsetField().isPresent()) {
443+
command.append(" offset_field=").append(node.getOffsetField().get());
444+
}
445+
446+
return command.toString();
447+
}
448+
422449
@Override
423450
public String visitParse(Parse node, String context) {
424451
String child = node.getChild().get(0).accept(this, context);
@@ -734,5 +761,11 @@ public String visitCast(Cast node, String context) {
734761
String expr = analyze(node.getExpression(), context);
735762
return StringUtils.format("cast(%s as %s)", expr, node.getConvertedType().toString());
736763
}
764+
765+
@Override
766+
public String visitQualifiedName(
767+
org.opensearch.sql.ast.expression.QualifiedName node, String context) {
768+
return String.join(".", node.getParts());
769+
}
737770
}
738771
}

ppl/src/test/java/org/opensearch/sql/ppl/utils/PPLQueryDataAnonymizerTest.java

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -511,6 +511,37 @@ public void testPatterns() {
511511
+ " variable_count_threshold=5"));
512512
}
513513

514+
@Test
515+
public void testRexCommand() {
516+
assertEquals(
517+
"source=t | rex field=message \"(?<user>[A-Z]+)\"",
518+
anonymize("source=t | rex field=message \"(?<user>[A-Z]+)\""));
519+
assertEquals(
520+
"source=t | rex field=lastname \"(?<initial>^[A-Z])\" | fields + lastname,initial",
521+
anonymize(
522+
"source=t | rex field=lastname \"(?<initial>^[A-Z])\" | fields lastname, initial"));
523+
assertEquals(
524+
"source=t | rex field=name \"(?<first>[A-Z])\" max_match=3",
525+
anonymize("source=t | rex field=name \"(?<first>[A-Z])\" max_match=3"));
526+
}
527+
528+
@Test
529+
public void testRexSedMode() {
530+
assertEquals(
531+
"source=t | rex field=lastname mode=sed \"s/^[A-Z]/X/\"",
532+
anonymize("source=t | rex field=lastname mode=sed \"s/^[A-Z]/X/\""));
533+
assertEquals(
534+
"source=t | rex field=data mode=sed \"s/sensitive/clean/g\" | fields + data",
535+
anonymize("source=t | rex field=data mode=sed \"s/sensitive/clean/g\" | fields data"));
536+
}
537+
538+
@Test
539+
public void testRexWithOffsetField() {
540+
assertEquals(
541+
"source=t | rex field=message \"(?<word>[a-z]+)\" offset_field=pos",
542+
anonymize("source=t | rex field=message \"(?<word>[a-z]+)\" offset_field=pos"));
543+
}
544+
514545
private String anonymize(String query) {
515546
AstBuilder astBuilder = new AstBuilder(query, settings);
516547
return anonymize(astBuilder.visit(parser.parse(query)));

0 commit comments

Comments
 (0)