A platform for high-performance distributed tool and library development written in C++. It can be deployed in two different cluster modes: standalone or distributed. API for v0.5.0, released on June 13, 2018.
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
QueryGraphAnalyzer.cc
Go to the documentation of this file.
1 /*****************************************************************************
2  * *
3  * Copyright 2018 Rice University *
4  * *
5  * Licensed under the Apache License, Version 2.0 (the "License"); *
6  * you may not use this file except in compliance with the License. *
7  * You may obtain a copy of the License at *
8  * *
9  * http://www.apache.org/licenses/LICENSE-2.0 *
10  * *
11  * Unless required by applicable law or agreed to in writing, software *
12  * distributed under the License is distributed on an "AS IS" BASIS, *
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
14  * See the License for the specific language governing permissions and *
15  * limitations under the License. *
16  * *
17  *****************************************************************************/
18 #ifndef QUERY_GRAPH_ANALYZER_SOURCE
19 #define QUERY_GRAPH_ANALYZER_SOURCE
20 
21 #include "QueryGraphAnalyzer.h"
22 #include "InputTupleSetSpecifier.h"
23 #include <string.h>
24 #include <vector>
25 
26 namespace pdb {
27 
29  std::vector<Handle<Computation>> &queryGraph) {
30  for (int i = 0; i < queryGraph.size(); i++) {
31  this->queryGraph.push_back(queryGraph[i]);
32  }
33 }
34 
36  Handle<Vector<Handle<Computation>>> queryGraph) {
37  for (int i = 0; i < queryGraph->size(); i++) {
38  this->queryGraph.push_back((*queryGraph)[i]);
39  }
40 }
41 
43 
44  Handle<Computation> curSink;
45  int computationLabel = 0;
46  std::vector<std::string> tcapStrings;
47  for (int i = 0; i < this->queryGraph.size(); i++) {
48 
49  std::vector<InputTupleSetSpecifier> inputTupleSets;
50  InputTupleSetSpecifier inputTupleSet;
51  inputTupleSets.push_back(inputTupleSet);
52  curSink = queryGraph[i];
53  std::string outputTupleSetName = "";
54  std::vector<std::string> outputColumnNames;
55  std::string addedOutputColumnName = "";
56  traverse(tcapStrings, curSink, inputTupleSets, computationLabel,
57  outputTupleSetName, outputColumnNames, addedOutputColumnName);
58  }
59 
60  std::string tcapStringToReturn = "";
61  for (int i = 0; i < tcapStrings.size(); i++) {
62  tcapStringToReturn += tcapStrings[i];
63  }
64  std::cout << tcapStringToReturn << std::endl;
65  return tcapStringToReturn;
66 }
67 
69  std::vector<std::string> &tcapStrings, Handle<Computation> sink,
70  std::vector<InputTupleSetSpecifier> inputTupleSets, int &computationLabel,
71  std::string &outputTupleSetName,
72  std::vector<std::string> &outputColumnNames,
73  std::string &addedOutputColumnName) {
74 
75  int numInputs = sink->getNumInputs();
76  std::string computationName = sink->getComputationType();
77  if (numInputs > 0) {
78  std::vector<InputTupleSetSpecifier> inputTupleSetsForMe;
79  for (int i = 0; i < numInputs; i++) {
80  Handle<Computation> curSink = sink->getIthInput(i);
81  if (curSink->isTraversed() == false) {
82  traverse(tcapStrings, curSink, inputTupleSets, computationLabel,
83  outputTupleSetName, outputColumnNames, addedOutputColumnName);
84  curSink->setTraversed(true);
85  } else {
86  // we met a materialized node
87  outputTupleSetName = curSink->getOutputTupleSetName();
88  addedOutputColumnName = curSink->getOutputColumnToApply();
89  int j = 0;
90  outputColumnNames.clear();
91  for (; j < outputColumnNames.size(); j++) {
92  if (addedOutputColumnName == outputColumnNames[j]) {
93  break;
94  }
95  }
96  if (j == outputColumnNames.size()) {
97  outputColumnNames.push_back(addedOutputColumnName);
98  }
99  }
100  std::vector<std::string> addedOutputColumns;
101  addedOutputColumns.push_back(addedOutputColumnName);
102  InputTupleSetSpecifier curOutput(outputTupleSetName, outputColumnNames,
103  addedOutputColumns);
104  inputTupleSetsForMe.push_back(curOutput);
105  }
106  outputColumnNames.clear();
107  addedOutputColumnName = "";
108  std::string curTcapString = sink->toTCAPString(
109  inputTupleSetsForMe, computationLabel, outputTupleSetName,
110  outputColumnNames, addedOutputColumnName);
111  tcapStrings.push_back(curTcapString);
112  computationLabel++;
113  } else {
114  if (sink->isTraversed() == false) {
115  outputColumnNames.clear();
116  addedOutputColumnName = "";
117  std::string curTcapString = sink->toTCAPString(
118  inputTupleSets, computationLabel, outputTupleSetName,
119  outputColumnNames, addedOutputColumnName);
120  tcapStrings.push_back(curTcapString);
121  computationLabel++;
122  } else {
123  outputTupleSetName = sink->getOutputTupleSetName();
124  addedOutputColumnName = sink->getOutputColumnToApply();
125  outputColumnNames.clear();
126  outputColumnNames.push_back(addedOutputColumnName);
127  }
128  }
129 }
130 
132 
133  sink->setTraversed(false);
134  int numInputs = sink->getNumInputs();
135  for (int i = 0; i < numInputs; i++) {
136  Handle<Computation> curNode = sink->getIthInput(i);
137  clearGraphMarks(curNode);
138  }
139 }
140 
142 
143  for (int i = 0; i < this->queryGraph.size(); i++) {
144  Handle<Computation> sink = this->queryGraph[i];
145  clearGraphMarks(sink);
146  }
147 }
148 
150  std::vector<Handle<Computation>> &computations, Handle<Computation> sink) {
151 
152  int numInputs = sink->getNumInputs();
153  for (int i = 0; i < numInputs; i++) {
154  Handle<Computation> curNode = sink->getIthInput(i);
155  parseComputations(computations, curNode);
156  }
157  if (sink->isTraversed() == false) {
158  computations.push_back(sink);
159  sink->setTraversed(true);
160  }
161 }
162 
164  std::vector<Handle<Computation>> &computations) {
165  this->clearGraphMarks();
166  for (int i = 0; i < this->queryGraph.size(); i++) {
167  Handle<Computation> sink = this->queryGraph[i];
168  parseComputations(computations, sink);
169  }
170 }
171 }
172 
173 #endif
std::vector< Handle< Computation > > queryGraph
QueryGraphAnalyzer(std::vector< Handle< Computation >> &queryGraph)
void parseComputations(std::vector< Handle< Computation >> &computations, Handle< Computation > sink)
void traverse(std::vector< std::string > &tcapStrings, Handle< Computation > sink, std::vector< InputTupleSetSpecifier > inputTupleSets, int &computationLabel, std::string &outputTupleSetName, std::vector< std::string > &outputColumnNames, std::string &addedOutputColumnName)