Skip to content

Commit

Permalink
refactor: Moved sql parser to connection
Browse files Browse the repository at this point in the history
  • Loading branch information
Julien Ruaux committed Feb 7, 2023
1 parent 46bf04f commit 3763da9
Show file tree
Hide file tree
Showing 4 changed files with 23 additions and 31 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@

public class SidecarConnection implements Connection {

private final SqlParser sqlParser = new SqlParser();
private final Connection connection;
private final ConnectionContext context;

Expand Down Expand Up @@ -334,4 +335,7 @@ public void evaluateRules(SidecarStatement sidecarStatement) {
context.getRuleSession().fire(sidecarStatement);
}

public SqlParser getSqlParser() {
return sqlParser;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import java.sql.SQLWarning;
import java.sql.Statement;
import java.util.Optional;
import java.util.Set;

import javax.sql.rowset.CachedRowSet;

Expand All @@ -26,6 +27,7 @@ public class SidecarStatement implements Statement {
private String sql;
private Optional<ResultSet> resultSet = Optional.empty();
private long ttl = RuleConfig.TTL_NO_CACHE;
private Set<String> tableNames;

public SidecarStatement(SidecarConnection connection, Statement statement, MeterRegistry meterRegistry) {
this.connection = connection;
Expand Down Expand Up @@ -368,4 +370,12 @@ public boolean isCloseOnCompletion() throws SQLException {
return statement.isCloseOnCompletion();
}

public Set<String> getTableNames() {
if (tableNames == null) {
tableNames = connection.getSqlParser().extractTableNames(sql);
}
return tableNames;

}

}
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,12 @@
import java.util.List;
import java.util.Set;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.regex.Pattern;

import com.google.common.base.Predicates;
import com.redis.sidecar.RulesConfig;
import com.redis.sidecar.RulesConfig.RuleConfig;
import com.redis.sidecar.SidecarStatement;
import com.redis.sidecar.SqlParser;

public class RuleSession implements PropertyChangeListener {

Expand All @@ -25,27 +23,12 @@ public void fire(SidecarStatement statement) {
for (Rule rule : rules) {
if (rule.evaluate(statement)) {
rule.execute(statement);
return;
}
}
}
}

private static class TableNameExtractor implements Function<SidecarStatement, Set<String>> {

private static final SqlParser SQL_PARSER = new SqlParser();

private Set<String> tableNames;

@Override
public Set<String> apply(SidecarStatement statement) {
if (tableNames == null) {
tableNames = SQL_PARSER.extractTableNames(statement.getSql());
}
return tableNames;
}

}

@SuppressWarnings("unchecked")
@Override
public void propertyChange(PropertyChangeEvent evt) {
Expand All @@ -55,26 +38,25 @@ public void propertyChange(PropertyChangeEvent evt) {
}

public void updateRules(List<RuleConfig> ruleConfigs) {
TableNameExtractor extractor = new TableNameExtractor();
synchronized (rules) {
rules.clear();
for (RuleConfig ruleConfig : ruleConfigs) {
rules.add(rule(ruleConfig, extractor));
rules.add(rule(ruleConfig));
}
}
}

private Rule rule(RuleConfig rule, TableNameExtractor extractor) {
private Rule rule(RuleConfig rule) {
Consumer<SidecarStatement> action = action(rule);
if (rule.getTables() != null) {
Set<String> tables = new HashSet<>(rule.getTables());
return new TableRule(tables::equals, extractor, action);
return new TableRule(tables::equals, action);
}
if (rule.getTablesAll() != null) {
return new TableRule(new TableRule.ContainsAllPredicate(rule.getTablesAll()), extractor, action);
return new TableRule(new TableRule.ContainsAllPredicate(rule.getTablesAll()), action);
}
if (rule.getTablesAny() != null) {
return new TableRule(new TableRule.ContainsAnyPredicate(rule.getTablesAll()), extractor, action);
return new TableRule(new TableRule.ContainsAnyPredicate(rule.getTablesAll()), action);
}
if (rule.getRegex() != null) {
return new RegexRule(Pattern.compile(rule.getRegex()), s -> s.getSql(), action);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,26 +5,22 @@
import java.util.List;
import java.util.Set;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;

import com.redis.sidecar.SidecarStatement;

public class TableRule extends AbstractRule {

private final Function<SidecarStatement, Set<String>> tableNamesExtractor;
private final Predicate<Set<String>> predicate;

public TableRule(Predicate<Set<String>> predicate, Function<SidecarStatement, Set<String>> tableNamesExtractor,
Consumer<SidecarStatement> action) {
public TableRule(Predicate<Set<String>> predicate, Consumer<SidecarStatement> action) {
super(action);
this.tableNamesExtractor = tableNamesExtractor;
this.predicate = predicate;
}

@Override
public boolean evaluate(SidecarStatement facts) {
return predicate.test(tableNamesExtractor.apply(facts));
public boolean evaluate(SidecarStatement statement) {
return predicate.test(statement.getTableNames());
}

public static class ContainsAnyPredicate implements Predicate<Set<String>> {
Expand Down

0 comments on commit 3763da9

Please sign in to comment.