private void addPrimaryKey(List<LogicalVariable> scanVariables, DataSource dataSource, IOptimizationContext context) { List<LogicalVariable> primaryKey = dataSource.getPrimaryKeyVariables(scanVariables); List<LogicalVariable> tail = new ArrayList<>(); tail.addAll(scanVariables); FunctionalDependency pk = new FunctionalDependency(primaryKey, tail); context.addPrimaryKey(pk); }
private void addPrimaryKeys(Map<LogicalVariable, LogicalVariable> varMap) { for (Entry<LogicalVariable, LogicalVariable> entry : varMap.entrySet()) { List<LogicalVariable> dependencyVars = context.findPrimaryKey(entry.getKey()); if (dependencyVars == null) { // No key dependencies continue; } List<LogicalVariable> newDependencies = new ArrayList<>(); for (LogicalVariable dependencyVar : dependencyVars) { LogicalVariable newDependencyVar = varMap.get(dependencyVar); if (newDependencyVar == null) { continue; } newDependencies.add(newDependencyVar); } context.addPrimaryKey( new FunctionalDependency(newDependencies, Collections.singletonList(entry.getValue()))); } }
public void updatePrimaryKeys(IOptimizationContext context) { inputVarToOutputVarMapping.forEach((key, value) -> { List<LogicalVariable> primaryKey = context.findPrimaryKey(key); if (primaryKey != null) { List<LogicalVariable> head = new ArrayList<>(); for (LogicalVariable variable : primaryKey) { head.add(inputVarToOutputVarMapping.get(variable)); } List<LogicalVariable> tail = new ArrayList<>(1); tail.add(value); context.addPrimaryKey(new FunctionalDependency(head, tail)); } }); }
@Override public Void visitGroupByOperator(GroupByOperator op, IOptimizationContext ctx) throws AlgebricksException { List<LogicalVariable> header = new ArrayList<>(); for (Pair<LogicalVariable, Mutable<ILogicalExpression>> gbyTerm : op.getGroupByList()) { header.add(gbyTerm.first); } List<LogicalVariable> liveVars = new ArrayList<>(); VariableUtilities.getSubplanLocalLiveVariables(op, liveVars); ctx.addPrimaryKey(new FunctionalDependency(header, liveVars)); return null; }
@Override public Void visitAssignOperator(AssignOperator op, IOptimizationContext ctx) throws AlgebricksException { // Obtain used variables on the right-hand side of an assign. Set<LogicalVariable> usedVars = new HashSet<>(); VariableUtilities.getUsedVariables(op, usedVars); Set<LogicalVariable> primaryKeyVars = null; for (LogicalVariable usedVar : usedVars) { List<LogicalVariable> keyVars = ctx.findPrimaryKey(usedVar); if (keyVars == null) { // No key variables can uniquely identify usedVar. return null; } if (primaryKeyVars == null) { primaryKeyVars = new HashSet<>(keyVars); } else { // The primary key is the union of all the key header variables. primaryKeyVars.addAll(keyVars); } } if (primaryKeyVars != null && !primaryKeyVars.isEmpty()) { List<LogicalVariable> producedVars = new ArrayList<>(); VariableUtilities.getProducedVariables(op, producedVars); // Generates new primary keys. ctx.addPrimaryKey(new FunctionalDependency(new ArrayList<LogicalVariable>(primaryKeyVars), producedVars)); } return null; }
@Override public Void visitAggregateOperator(AggregateOperator op, IOptimizationContext ctx) throws AlgebricksException { ctx.addPrimaryKey(new FunctionalDependency(op.getVariables(), op.getVariables())); return null; }
OperatorPropertiesUtil.markMovable(assignOp, !usedForCorrelationJoin); assignOp.getInputs().add(new MutableObject<ILogicalOperator>(operator)); context.addPrimaryKey(new FunctionalDependency(Collections.singletonList(assignVar), new ArrayList<LogicalVariable>(liveVars))); context.computeAndSetTypeEnvironmentForOperator(assignOp);
tail.add(v); FunctionalDependency pk = new FunctionalDependency(keys, tail); context.addPrimaryKey(pk);