Skip to content

Commit 171d182

Browse files
committed
Check patterns support using multiple filters, separated by a comma.
1 parent 19e4c01 commit 171d182

File tree

3 files changed

+80
-23
lines changed

3 files changed

+80
-23
lines changed

dqops/src/main/java/com/dqops/metadata/defaultchecks/column/TargetColumnPatternFilter.java

+7-7
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,8 @@
2929
* Target column filter for default checks that uses parsed patterns.
3030
*/
3131
public class TargetColumnPatternFilter extends TargetTablePatternFilter {
32-
private SearchPattern columnPattern;
33-
private SearchPattern dataTypePattern;
32+
private SearchPattern[] columnPattern;
33+
private SearchPattern[] dataTypePattern;
3434
private DataTypeCategory dataTypeCategory;
3535

3636
/**
@@ -41,11 +41,11 @@ public TargetColumnPatternFilter(TargetColumnPatternSpec columnPatternSpec) {
4141
super(columnPatternSpec);
4242

4343
if (!Strings.isNullOrEmpty(columnPatternSpec.getColumn())) {
44-
this.columnPattern = SearchPattern.create(false, columnPatternSpec.getColumn());
44+
this.columnPattern = SearchPattern.createForCommaSeparatedPatterns(false, columnPatternSpec.getColumn());
4545
}
4646

4747
if (!Strings.isNullOrEmpty(columnPatternSpec.getDataType())) {
48-
this.dataTypePattern = SearchPattern.create(false, columnPatternSpec.getDataType());
48+
this.dataTypePattern = SearchPattern.createForCommaSeparatedPatterns(false, columnPatternSpec.getDataType());
4949
}
5050

5151
this.dataTypeCategory = columnPatternSpec.getDataTypeCategory();
@@ -61,13 +61,13 @@ public TargetColumnPatternFilter(TargetColumnPatternSpec columnPatternSpec) {
6161
*/
6262
public boolean match(ConnectionSpec connectionSpec, TableSpec tableSpec, ColumnSpec columnSpec, DataTypeCategory dataTypeCategory) {
6363
if (this.columnPattern != null) {
64-
if (!this.columnPattern.match(columnSpec.getColumnName())) {
64+
if (!SearchPattern.matchAny(this.columnPattern, columnSpec.getColumnName())) {
6565
return false;
6666
}
6767
}
6868

6969
if (this.dataTypePattern != null) {
70-
if (columnSpec.getTypeSnapshot() == null || !this.dataTypePattern.match(columnSpec.getTypeSnapshot().getColumnType())) {
70+
if (columnSpec.getTypeSnapshot() == null || !SearchPattern.matchAny(this.dataTypePattern, columnSpec.getTypeSnapshot().getColumnType())) {
7171
return false;
7272
}
7373
}
@@ -86,7 +86,7 @@ public boolean match(ConnectionSpec connectionSpec, TableSpec tableSpec, ColumnS
8686
LabelSetSpec columnSpecLabels = columnSpec.getLabels();
8787
if (columnSpecLabels != null && !columnSpecLabels.isEmpty()) {
8888
for (String label : columnSpecLabels) {
89-
if (this.labelPattern.match(label)) {
89+
if (SearchPattern.matchAny(this.labelPattern, label)) {
9090
return true;
9191
}
9292
}

dqops/src/main/java/com/dqops/metadata/defaultchecks/table/TargetTablePatternFilter.java

+16-16
Original file line numberDiff line numberDiff line change
@@ -26,36 +26,36 @@
2626
* Target table filter for default checks that uses parsed patterns.
2727
*/
2828
public class TargetTablePatternFilter {
29-
private SearchPattern connectionPattern;
30-
private SearchPattern schemaPattern;
31-
private SearchPattern tablePattern;
32-
private SearchPattern stagePattern;
29+
private SearchPattern[] connectionPattern;
30+
private SearchPattern[] schemaPattern;
31+
private SearchPattern[] tablePattern;
32+
private SearchPattern[] stagePattern;
3333
private Integer tablePriority;
34-
protected SearchPattern labelPattern;
34+
protected SearchPattern[] labelPattern;
3535

3636
/**
3737
* Creates a table pattern search object given a target table pattern specification. Creates search patterns for filled fields.
3838
* @param tablePatternSpec Target table search pattern.
3939
*/
4040
public TargetTablePatternFilter(TargetTablePatternSpec tablePatternSpec) {
4141
if (!Strings.isNullOrEmpty(tablePatternSpec.getConnection())) {
42-
this.connectionPattern = SearchPattern.create(false, tablePatternSpec.getConnection());
42+
this.connectionPattern = SearchPattern.createForCommaSeparatedPatterns(false, tablePatternSpec.getConnection());
4343
}
4444

4545
if (!Strings.isNullOrEmpty(tablePatternSpec.getSchema())) {
46-
this.schemaPattern = SearchPattern.create(false, tablePatternSpec.getSchema());
46+
this.schemaPattern = SearchPattern.createForCommaSeparatedPatterns(false, tablePatternSpec.getSchema());
4747
}
4848

4949
if (!Strings.isNullOrEmpty(tablePatternSpec.getTable())) {
50-
this.tablePattern = SearchPattern.create(false, tablePatternSpec.getTable());
50+
this.tablePattern = SearchPattern.createForCommaSeparatedPatterns(false, tablePatternSpec.getTable());
5151
}
5252

5353
if (!Strings.isNullOrEmpty(tablePatternSpec.getStage())) {
54-
this.stagePattern = SearchPattern.create(false, tablePatternSpec.getStage());
54+
this.stagePattern = SearchPattern.createForCommaSeparatedPatterns(false, tablePatternSpec.getStage());
5555
}
5656

5757
if (!Strings.isNullOrEmpty(tablePatternSpec.getLabel())) {
58-
this.labelPattern = SearchPattern.create(false, tablePatternSpec.getLabel());
58+
this.labelPattern = SearchPattern.createForCommaSeparatedPatterns(false, tablePatternSpec.getLabel());
5959
}
6060

6161
this.tablePriority = tablePatternSpec.getTablePriority();
@@ -70,25 +70,25 @@ public TargetTablePatternFilter(TargetTablePatternSpec tablePatternSpec) {
7070
*/
7171
public boolean match(ConnectionSpec connectionSpec, TableSpec tableSpec, boolean matchLabels) {
7272
if (this.connectionPattern != null) {
73-
if (!this.connectionPattern.match(connectionSpec.getConnectionName())) {
73+
if (!SearchPattern.matchAny(this.connectionPattern, connectionSpec.getConnectionName())) {
7474
return false;
7575
}
7676
}
7777

7878
if (this.schemaPattern != null) {
79-
if (!this.schemaPattern.match(tableSpec.getPhysicalTableName().getSchemaName())) {
79+
if (!SearchPattern.matchAny(this.schemaPattern, tableSpec.getPhysicalTableName().getSchemaName())) {
8080
return false;
8181
}
8282
}
8383

8484
if (this.tablePattern != null) {
85-
if (!this.tablePattern.match(tableSpec.getPhysicalTableName().getTableName())) {
85+
if (!SearchPattern.matchAny(this.tablePattern, tableSpec.getPhysicalTableName().getTableName())) {
8686
return false;
8787
}
8888
}
8989

9090
if (this.stagePattern != null) {
91-
if (!this.stagePattern.match(tableSpec.getStage())) {
91+
if (!SearchPattern.matchAny(this.stagePattern, tableSpec.getStage())) {
9292
return false;
9393
}
9494
}
@@ -103,7 +103,7 @@ public boolean match(ConnectionSpec connectionSpec, TableSpec tableSpec, boolean
103103
LabelSetSpec connectionLabels = connectionSpec.getLabels();
104104
if (connectionLabels != null && !connectionLabels.isEmpty()) {
105105
for (String label : connectionLabels) {
106-
if (this.labelPattern.match(label)) {
106+
if (SearchPattern.matchAny(this.labelPattern, label)) {
107107
return true;
108108
}
109109
}
@@ -112,7 +112,7 @@ public boolean match(ConnectionSpec connectionSpec, TableSpec tableSpec, boolean
112112
LabelSetSpec tableLabels = tableSpec.getLabels();
113113
if (tableLabels != null && !tableLabels.isEmpty()) {
114114
for (String label : tableLabels) {
115-
if (this.labelPattern.match(label)) {
115+
if (SearchPattern.matchAny(this.labelPattern, label)) {
116116
return true;
117117
}
118118
}

dqops/src/main/java/com/dqops/metadata/search/pattern/SearchPattern.java

+57
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package com.dqops.metadata.search.pattern;
1818

1919
import com.fasterxml.jackson.annotation.JsonIgnore;
20+
import org.apache.commons.lang3.StringUtils;
2021

2122
import java.util.AbstractMap;
2223
import java.util.Map;
@@ -82,6 +83,12 @@ protected static AbstractSearchPatternStrategy determineSearchPatternStrategy(bo
8283
}
8384
}
8485

86+
/**
87+
* Creates a search pattern for a given configuration.
88+
* @param ignoreCase Ignore case.
89+
* @param patternString Pattern text.
90+
* @return Search pattern.
91+
*/
8592
public static SearchPattern create(boolean ignoreCase, String patternString) {
8693
if (patternString == null) {
8794
throw new IllegalArgumentException("Search pattern is null.");
@@ -91,13 +98,63 @@ public static SearchPattern create(boolean ignoreCase, String patternString) {
9198
return new SearchPattern(patternString, searchPatternStrategy);
9299
}
93100

101+
/**
102+
* Creates an array of search patterns for values that are comma separated.
103+
* @param ignoreCase Ignore case.
104+
* @param patternString Pattern text with comma separated values.
105+
* @return Search pattern.
106+
*/
107+
public static SearchPattern[] createForCommaSeparatedPatterns(boolean ignoreCase, String patternString) {
108+
if (patternString == null) {
109+
throw new IllegalArgumentException("Search pattern is null.");
110+
}
111+
112+
String[] textPatterns = StringUtils.split(patternString, ',');
113+
if (textPatterns.length == 0) {
114+
return null;
115+
}
116+
117+
SearchPattern[] searchPatterns = new SearchPattern[textPatterns.length];
118+
for (int i = 0; i < searchPatterns.length; i++) {
119+
String pattern = textPatterns[i];
120+
AbstractSearchPatternStrategy searchPatternStrategy = determineSearchPatternStrategy(ignoreCase, pattern);
121+
searchPatterns[i] = new SearchPattern(pattern, searchPatternStrategy);
122+
}
123+
124+
return searchPatterns;
125+
}
126+
127+
/**
128+
* Tests a text if it matches the pattern.
129+
* @param otherString Text to verify.
130+
* @return True when the value matches a pattern.
131+
*/
94132
public boolean match(String otherString) {
95133
if (this.searchPatternStrategy == null) {
96134
return false;
97135
}
98136
return this.searchPatternStrategy.match(otherString);
99137
}
100138

139+
/**
140+
* Tests the text if it matches any pattern from the array of check patterns.
141+
* @param patterns Array of check patterns.
142+
* @param text Text to verify.
143+
* @return True when it matches any pattern.
144+
*/
145+
public static boolean matchAny(SearchPattern[] patterns, String text) {
146+
for (SearchPattern pattern : patterns) {
147+
if (pattern.match(text)) {
148+
return true;
149+
}
150+
}
151+
152+
return false;
153+
}
154+
155+
/**
156+
* Checks if the pattern contains a wildcard character '*'.
157+
*/
101158
@JsonIgnore
102159
public boolean isWildcardSearchPattern() {
103160
if (this.searchPatternStrategy == null) {

0 commit comments

Comments
 (0)