blob: 13846c4873bbfcf0d462146ceb61bc61836a4012 [file] [log] [blame]
#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
from pywy.old_graph.node import Node
import logging
# Adjacency Matrix used to analise the plan
class Graph:
def __init__(self):
self.graph = {}
self.nodes_no = 0
self.nodes = []
# Fills the Graph
def populate(self, sinks):
for sink in iter(sinks):
self.process_operator(sink)
# Add current operator and set dependencies
def process_operator(self, operator):
self.add_node(operator.operator_type, operator.id, operator)
if len(operator.previous) > 0:
for parent in operator.previous:
if parent:
self.add_node(parent.operator_type, parent.id, parent)
self.add_link(operator.id, parent.id, 1)
self.process_operator(parent)
def add_node(self, name, id, operator):
if id in self.nodes:
return
self.nodes_no += 1
self.nodes.append(id)
new_node = Node(name, id, operator)
self.graph[id] = new_node
def add_link(self, id_child, id_parent, e):
if id_child in self.nodes:
if id_parent in self.nodes:
self.graph[id_child].add_predecessor(id_parent, e)
self.graph[id_parent].add_successor(id_child, e)
def print_adjlist(self):
for key in self.graph:
logging.debug("Node: ", self.graph[key].operator_type, " - ", key)
for key2 in self.graph[key].predecessors:
logging.debug("- Parent: ", self.graph[key2].operator_type, " - ", self.graph[key].predecessors[key2], " - ", key2)
for key2 in self.graph[key].successors:
logging.debug("- Child: ", self.graph[key2].operator_type, " - ", self.graph[key].successors[key2], " - ", key2)
def get_node(self, id):
return self.graph[id]