private List<LogicalVariable> findPrimaryKeysInSubplan(Collection<LogicalVariable> liveVars, IOptimizationContext context) { Collection<LogicalVariable> primaryKeys = new HashSet<>(); for (LogicalVariable var : liveVars) { List<LogicalVariable> pks = context.findPrimaryKey(var); if (pks != null) { primaryKeys.addAll(pks); } } if (primaryKeys.isEmpty()) { return new ArrayList<>(); } return new ArrayList<>(primaryKeys); } }
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 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; }
Set<LogicalVariable> noKeyVars = new HashSet<>(); for (LogicalVariable liveVar : liveVars) { List<LogicalVariable> keyVars = context.findPrimaryKey(liveVar); if (keyVars != null) { keyVars.retainAll(liveVars);
VariableReferenceExpression ref = (VariableReferenceExpression) arg; LogicalVariable var = ref.getVariableReference(); List<LogicalVariable> keys = context.findPrimaryKey(var); if (keys != null) { List<LogicalVariable> tail = new ArrayList<LogicalVariable>();
if (context.findPrimaryKey(var) == null) {