Skip to content

Commit fd19047

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

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
@@ -71,6 +71,7 @@
7171
import org.opensearch.sql.ast.tree.Relation;
7272
import org.opensearch.sql.ast.tree.Rename;
7373
import org.opensearch.sql.ast.tree.Reverse;
74+
import org.opensearch.sql.ast.tree.Rex;
7475
import org.opensearch.sql.ast.tree.Sort;
7576
import org.opensearch.sql.ast.tree.SubqueryAlias;
7677
import org.opensearch.sql.ast.tree.TableFunction;
@@ -363,6 +364,32 @@ public String visitReverse(Reverse node, String context) {
363364
return StringUtils.format("%s | reverse", child);
364365
}
365366

367+
@Override
368+
public String visitRex(Rex node, String context) {
369+
String child = node.getChild().get(0).accept(this, context);
370+
String field = visitExpression(node.getField());
371+
String pattern = "\"" + node.getPattern().toString() + "\"";
372+
StringBuilder command = new StringBuilder();
373+
374+
// Build the base command
375+
if (node.getMode() == Rex.RexMode.SED) {
376+
command.append(String.format("%s | rex field=%s mode=sed %s", child, field, pattern));
377+
} else {
378+
command.append(String.format("%s | rex field=%s %s", child, field, pattern));
379+
}
380+
381+
// Add optional parameters
382+
if (node.getMaxMatch().isPresent()) {
383+
command.append(" max_match=").append(node.getMaxMatch().get());
384+
}
385+
386+
if (node.getOffsetField().isPresent()) {
387+
command.append(" offset_field=").append(node.getOffsetField().get());
388+
}
389+
390+
return command.toString();
391+
}
392+
366393
@Override
367394
public String visitParse(Parse node, String context) {
368395
String child = node.getChild().get(0).accept(this, context);
@@ -678,5 +705,11 @@ public String visitCast(Cast node, String context) {
678705
String expr = analyze(node.getExpression(), context);
679706
return StringUtils.format("cast(%s as %s)", expr, node.getConvertedType().toString());
680707
}
708+
709+
@Override
710+
public String visitQualifiedName(
711+
org.opensearch.sql.ast.expression.QualifiedName node, String context) {
712+
return String.join(".", node.getParts());
713+
}
681714
}
682715
}

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
@@ -485,6 +485,37 @@ public void testPatterns() {
485485
+ " variable_count_threshold=5"));
486486
}
487487

488+
@Test
489+
public void testRexCommand() {
490+
assertEquals(
491+
"source=t | rex field=message \"(?<user>[A-Z]+)\"",
492+
anonymize("source=t | rex field=message \"(?<user>[A-Z]+)\""));
493+
assertEquals(
494+
"source=t | rex field=lastname \"(?<initial>^[A-Z])\" | fields + lastname,initial",
495+
anonymize(
496+
"source=t | rex field=lastname \"(?<initial>^[A-Z])\" | fields lastname, initial"));
497+
assertEquals(
498+
"source=t | rex field=name \"(?<first>[A-Z])\" max_match=3",
499+
anonymize("source=t | rex field=name \"(?<first>[A-Z])\" max_match=3"));
500+
}
501+
502+
@Test
503+
public void testRexSedMode() {
504+
assertEquals(
505+
"source=t | rex field=lastname mode=sed \"s/^[A-Z]/X/\"",
506+
anonymize("source=t | rex field=lastname mode=sed \"s/^[A-Z]/X/\""));
507+
assertEquals(
508+
"source=t | rex field=data mode=sed \"s/sensitive/clean/g\" | fields + data",
509+
anonymize("source=t | rex field=data mode=sed \"s/sensitive/clean/g\" | fields data"));
510+
}
511+
512+
@Test
513+
public void testRexWithOffsetField() {
514+
assertEquals(
515+
"source=t | rex field=message \"(?<word>[a-z]+)\" offset_field=pos",
516+
anonymize("source=t | rex field=message \"(?<word>[a-z]+)\" offset_field=pos"));
517+
}
518+
488519
private String anonymize(String query) {
489520
AstBuilder astBuilder = new AstBuilder(query, settings);
490521
return anonymize(astBuilder.visit(parser.parse(query)));

0 commit comments

Comments
 (0)