OrderGraph *buildOrderGraph(Order *order) {
OrderGraph *orderGraph = new OrderGraph(order);
+ order->graph = orderGraph;
uint constrSize = order->constraints.getSize();
for (uint j = 0; j < constrSize; j++) {
orderGraph->addOrderConstraintToOrderGraph(order->constraints.get(j));
}
}
-OrderNode *OrderGraph::getOrderNodeFromOrderGraph(uint64_t id, bool create) {
+OrderNode *OrderGraph::getOrderNodeFromOrderGraph(uint64_t id) {
OrderNode *node = new OrderNode(id);
OrderNode *tmp = nodes->get(node);
if ( tmp != NULL) {
delete node;
node = tmp;
- } else if (create) {
- nodes->add(node);
} else {
- delete node;
- return NULL;
+ nodes->add(node);
}
return node;
}
return tmp;
}
-OrderEdge *OrderGraph::getOrderEdgeFromOrderGraph(OrderNode *begin, OrderNode *end, bool create) {
+OrderEdge *OrderGraph::getOrderEdgeFromOrderGraph(OrderNode *begin, OrderNode *end) {
OrderEdge *edge = new OrderEdge(begin, end);
OrderEdge *tmp = edges->get(edge);
if ( tmp != NULL ) {
delete edge;
edge = tmp;
- } else if (create) {
- edges->add(edge);
} else {
- delete edge;
- return NULL;
+ edges->add(edge);
}
return edge;
}
delete nodes;
delete edges;
}
+
+bool OrderGraph::isTherePath(OrderNode *source, OrderNode *destination){
+ HashsetOrderNode visited;
+ visited.add(source);
+ SetIteratorOrderEdge *iterator = source->outEdges.iterator();
+ bool found = false;
+ while(iterator->hasNext()){
+ OrderNode* node = iterator->next()->sink;
+ if(!visited.contains(node)){
+ if( node == destination ){
+ found = true;
+ break;
+ }
+ visited.add(node);
+ found =isTherePathVisit(visited, node, destination);
+ if(found){
+ break;
+ }
+ }
+ }
+ delete iterator;
+ return found;
+}
+
+bool OrderGraph::isTherePathVisit(HashsetOrderNode &visited, OrderNode* current, OrderNode* destination){
+ SetIteratorOrderEdge *iterator = current->outEdges.iterator();
+ bool found = false;
+ while(iterator->hasNext()){
+ OrderNode* node = iterator->next()->sink;
+ if(node == destination){
+ found = true;
+ break;
+ }
+ visited.add(node);
+ if(isTherePathVisit(visited, node, destination)){
+ found = true;
+ break;
+ }
+ }
+ delete iterator;
+ return found;
+}