public PlanNode getNode(int group) { return getGroup(group).membership; }
public Optional<PlanNodeCostEstimate> getCumulativeCost(int group) { return Optional.ofNullable(getGroup(group).cumulativeCost); }
public void storeCumulativeCost(int group, PlanNodeCostEstimate cost) { getGroup(group).cumulativeCost = requireNonNull(cost, "cost is null"); }
public Optional<PlanNodeStatsEstimate> getStats(int group) { return Optional.ofNullable(getGroup(group).stats); }
public void storeStats(int groupId, PlanNodeStatsEstimate stats) { Group group = getGroup(groupId); if (group.stats != null) { evictStatisticsAndCost(groupId); // cost is derived from stats, also needs eviction } group.stats = requireNonNull(stats, "stats is null"); }
private void deleteGroup(int group) { checkArgument(getGroup(group).incomingReferences.isEmpty(), "Cannot delete group that has incoming references"); PlanNode deletedNode = groups.remove(group).membership; decrementReferenceCounts(deletedNode, group); }
public PlanNode replace(int group, PlanNode node, String reason) { PlanNode old = getGroup(group).membership; checkArgument(new HashSet<>(old.getOutputSymbols()).equals(new HashSet<>(node.getOutputSymbols())), "%s: transformed expression doesn't produce same outputs: %s vs %s", reason, old.getOutputSymbols(), node.getOutputSymbols()); if (node instanceof GroupReference) { node = getNode(((GroupReference) node).getGroupId()); } else { node = insertChildrenAndRewrite(node); } incrementReferenceCounts(node, group); getGroup(group).membership = node; decrementReferenceCounts(old, group); evictStatisticsAndCost(group); return node; }