OmniSciDB  c0231cc57d
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
org.apache.calcite.rel.rules.InjectFilterRule Class Reference
+ Inheritance diagram for org.apache.calcite.rel.rules.InjectFilterRule:
+ Collaboration diagram for org.apache.calcite.rel.rules.InjectFilterRule:

Classes

interface  Config
 

Public Member Functions

 InjectFilterRule (Config config, List< Restriction > restrictions)
 
void onMatch (RelOptRuleCall call)
 

Static Public Attributes

static Set< String > visitedMemo = new HashSet<>()
 

Package Functions

void clearMemo ()
 

Package Attributes

final List< Restrictionrestrictions
 

Static Package Attributes

static final Logger HEAVYDBLOGGER = LoggerFactory.getLogger(InjectFilterRule.class)
 

Detailed Description

Definition at line 38 of file InjectFilterRule.java.

Constructor & Destructor Documentation

org.apache.calcite.rel.rules.InjectFilterRule.InjectFilterRule ( Config  config,
List< Restriction restrictions 
)
inline

Definition at line 45 of file InjectFilterRule.java.

References org.apache.calcite.rel.rules.InjectFilterRule.clearMemo(), and org.apache.calcite.rel.rules.InjectFilterRule.restrictions.

Referenced by org.apache.calcite.rel.rules.InjectFilterRule.Config.toRule().

45  {
46  super(config);
47  this.restrictions = restrictions;
48  clearMemo();
49  }

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

Member Function Documentation

void org.apache.calcite.rel.rules.InjectFilterRule.clearMemo ( )
inlinepackage

Definition at line 51 of file InjectFilterRule.java.

Referenced by org.apache.calcite.rel.rules.InjectFilterRule.InjectFilterRule().

51  {
52  visitedMemo.clear();
53  }

+ Here is the caller graph for this function:

void org.apache.calcite.rel.rules.InjectFilterRule.onMatch ( RelOptRuleCall  call)
inline

Definition at line 56 of file InjectFilterRule.java.

References field(), org.apache.calcite.rel.rules.InjectFilterRule.restrictions, and org.apache.calcite.rel.rules.InjectFilterRule.visitedMemo.

56  {
57  LogicalTableScan parentNode = call.rel(0);
58  if (visitedMemo.contains(parentNode.toString())) {
59  return;
60  } else {
61  visitedMemo.add(parentNode.toString());
62  }
63  RelOptTable table = parentNode.getTable();
64  List<String> qname = table.getQualifiedName();
65 
66  String query_database = null;
67  String query_table = null;
68  if (qname.size() == 2) {
69  query_database = qname.get(0);
70  query_table = qname.get(1);
71  }
72  if (query_database == null || query_database.isEmpty() || query_table == null
73  || query_table.isEmpty()) {
74  throw new RuntimeException(
75  "Restrictions: Expected qualified name as [database, table] but got: "
76  + qname);
77  }
78 
79  ArrayList<RexNode> orList = new ArrayList<RexNode>();
80  RelBuilder builder = call.builder();
81  RexBuilder rBuilder = builder.getRexBuilder();
82  builder = builder.push(parentNode);
83  boolean found = false;
84  for (Restriction restriction : restrictions) {
85  // Match the database name.
86  String rest_database = restriction.getRestrictionDatabase();
87  if (rest_database != null && !rest_database.isEmpty()
88  && !rest_database.equals(query_database)) {
89  // TODO(sy): Maybe remove the isEmpty() wildcarding in HEAVY.AI 6.0.
90  HEAVYDBLOGGER.debug("RLS row-level security restriction for database "
91  + rest_database + " ignored because this query is on database "
92  + query_database);
93  continue;
94  }
95 
96  // Match the table name.
97  String rest_table = restriction.getRestrictionTable();
98  if (rest_table != null && !rest_table.isEmpty()
99  && !rest_table.equals(query_table)) {
100  // TODO(sy): Maybe remove the isEmpty() wildcarding in HEAVY.AI 6.0.
101  HEAVYDBLOGGER.debug("RLS row-level security restriction for table " + rest_table
102  + " ignored because this query is on table " + query_table);
103  continue;
104  }
105 
106  // Match the column name.
107  RelDataTypeField field = table.getRowType().getField(
108  restriction.getRestrictionColumn(), false, false);
109  if (field == null) {
110  HEAVYDBLOGGER.debug("RLS row-level security restriction for column "
111  + restriction.getRestrictionColumn()
112  + " ignored because column not present in query table " + query_table);
113  continue;
114  }
115 
116  // Generate the RLS row-level security filter for one Restriction.
117  found = true;
118  HEAVYDBLOGGER.debug(
119  "Scan is " + parentNode.toString() + " TABLE is " + table.toString());
120  HEAVYDBLOGGER.debug("Column " + restriction.getRestrictionColumn()
121  + " exists in table " + table.getQualifiedName());
122 
123  for (String val : restriction.getRestrictionValues()) {
124  HEAVYDBLOGGER.debug("Column is " + restriction.getRestrictionColumn()
125  + " literal is '" + val + "'");
126  RexNode lit;
127  if (SqlTypeName.NUMERIC_TYPES.indexOf(field.getType().getSqlTypeName()) == -1) {
128  if (val.length() < 2 || val.charAt(0) != '\''
129  || val.charAt(val.length() - 1) != '\'') {
130  throw new RuntimeException(
131  "Restrictions: Expected a CREATE POLICY VALUES string with single quotes.");
132  }
133  lit = rBuilder.makeLiteral(
134  val.substring(1, val.length() - 1), field.getType(), false);
135  } else {
136  lit = rBuilder.makeLiteral(Integer.parseInt(val), field.getType(), false);
137  }
138  RexNode rn = builder.call(SqlStdOperatorTable.EQUALS,
139  builder.field(restriction.getRestrictionColumn()),
140  lit);
141  orList.add(rn);
142  }
143  }
144 
145  if (found) {
146  RexNode relOr = builder.call(SqlStdOperatorTable.OR, orList);
147  final RelNode newNode = builder.filter(relOr).build();
148  call.transformTo(newNode);
149  }
150  };
const rapidjson::Value & field(const rapidjson::Value &obj, const char field[]) noexcept
Definition: JsonAccessors.h:31

+ Here is the call graph for this function:

Member Data Documentation

final Logger org.apache.calcite.rel.rules.InjectFilterRule.HEAVYDBLOGGER = LoggerFactory.getLogger(InjectFilterRule.class)
staticpackage

Definition at line 42 of file InjectFilterRule.java.

final List<Restriction> org.apache.calcite.rel.rules.InjectFilterRule.restrictions
package
Set<String> org.apache.calcite.rel.rules.InjectFilterRule.visitedMemo = new HashSet<>()
static

The documentation for this class was generated from the following file: