33 template<
class OutType>
42 return input.getInputIndex(i);
52 return std::string(
"deref");
55 std::string
toTCAPString(std::vector<std::string> &inputTupleSetNames,
56 std::vector<std::string> &inputColumnNames,
57 std::vector<std::string> &inputColumnsToApply,
58 std::vector<std::string> &childrenLambdaNames,
60 std::string computationName,
62 std::string &outputTupleSetName,
63 std::vector<std::string> &outputColumns,
64 std::string &outputColumnName,
65 std::string &lambdaName,
67 bool amIPartOfJoinPredicate =
false,
68 bool amILeftChildOfEqualLambda =
false,
69 bool amIRightChildOfEqualLambda =
false,
70 std::string parentLambdaName =
"",
71 bool isSelfJoin =
false)
override {
74 mustache::data lambdaData;
76 lambdaData.set(
"lambdaLabel", std::to_string(lambdaLabel));
77 lambdaData.set(
"computationName", computationName);
78 lambdaData.set(
"computationLabel", std::to_string(computationLabel));
81 mustache::mustache lambdaNameTemplate{
"{{typeOfLambda}}_{{lambdaLabel}}"};
82 lambdaName = lambdaNameTemplate.render(lambdaData);
84 std::string inputTupleSetName;
85 std::string tupleSetMidTag;
88 if (multiInputsComp ==
nullptr) {
89 tupleSetMidTag =
"OutFor";
90 inputTupleSetName = inputTupleSetNames[0];
92 tupleSetMidTag =
"ExtractedFor";
94 inputTupleSetName = multiInputsComp->getTupleSetNameForIthInput(index);
95 inputColumnNames = multiInputsComp->getInputColumnsForIthInput(index);
96 inputColumnsToApply = multiInputsComp->getInputColumnsToApplyForIthInput(index);
100 lambdaData.set(
"tupleSetMidTag", tupleSetMidTag);
103 mustache::mustache outputTupleSetNameTemplate{
"deref_{{lambdaLabel}}{{tupleSetMidTag}}{{computationName}}{{computationLabel}}"};
104 outputTupleSetName = outputTupleSetNameTemplate.render(lambdaData);
107 outputColumnName = inputColumnsToApply[0];
108 PDB_COUT <<
"OuputColumnName: " << outputColumnName <<
"\n";
111 mustache::data outputColumnsData = mustache::data::type::list;
112 outputColumns.clear();
113 for (
const auto &inputColumnName : inputColumnNames) {
114 if (inputColumnName != outputColumnName) {
115 outputColumns.push_back(inputColumnName);
118 mustache::data columnData;
119 columnData.set(
"columnName", inputColumnName);
120 columnData.set(
"isLast",
false);
123 outputColumnsData.push_back(columnData);
128 outputColumns.push_back(outputColumnName);
131 mustache::data lastColumnData;
132 lastColumnData.set(
"columnName", outputColumnName);
133 lastColumnData.set(
"isLast",
true);
134 outputColumnsData.push_back(lastColumnData);
137 mustache::data inputColumnsToApplyData = mustache::data::type::list;
138 for(
int i = 0; i < inputColumnsToApply.size(); i++) {
141 mustache::data columnData;
142 columnData.set(
"columnName", inputColumnsToApply[i]);
143 columnData.set(
"isLast", i == inputColumnsToApply.size()-1);
146 inputColumnsToApplyData.push_back(columnData);
150 std::vector<std::string> inputColumnsToKeep;
151 for (
const auto &inputColumnName : inputColumnNames) {
152 if(std::find(inputColumnsToApply.begin(), inputColumnsToApply.end(), inputColumnName) == inputColumnsToApply.end()) {
154 inputColumnsToKeep.push_back(inputColumnName);
159 mustache::data inputColumnsToKeepData = mustache::data::type::list;
160 for(
int i = 0; i < inputColumnsToKeep.size(); i++) {
163 mustache::data columnData;
164 columnData.set(
"columnName", inputColumnsToKeep[i]);
165 columnData.set(
"isLast", i == inputColumnsToKeep.size()-1);
167 inputColumnsToKeepData.push_back(columnData);
171 lambdaData.set(
"outputTupleSetName", outputTupleSetName);
172 lambdaData.set(
"outputColumns", outputColumnsData);
173 lambdaData.set(
"inputTupleSetName", inputTupleSetName);
174 lambdaData.set(
"inputColumnsToApply", inputColumnsToApplyData);
175 lambdaData.set(
"inputColumnsToKeep", inputColumnsToKeepData);
176 lambdaData.set(
"lambdaName", lambdaName);
179 mustache::mustache ApplyTemplate{
"{{outputTupleSetName}}"
180 "({{#outputColumns}}{{columnName}}{{^isLast}}, {{/isLast}}{{/outputColumns}})"
181 " <= APPLY ({{inputTupleSetName}}({{#inputColumnsToApply}}{{columnName}}{{^isLast}}, {{/isLast}}{{/inputColumnsToApply}}), "
182 "{{inputTupleSetName}}({{#inputColumnsToKeep}}{{columnName}}{{^isLast}}, {{/isLast}}{{/inputColumnsToKeep}}), "
183 "'{{computationName}}_{{computationLabel}}', '{{lambdaName}}')\n"};
186 std::string tcapString = ApplyTemplate.render(lambdaData);
188 if (multiInputsComp !=
nullptr) {
189 if (amILeftChildOfEqualLambda || amIRightChildOfEqualLambda) {
190 inputTupleSetName = outputTupleSetName;
191 inputColumnNames.clear();
192 for (
const auto &outputColumn : outputColumns) {
194 if (outputColumn != outputColumnName) {
195 inputColumnNames.push_back(outputColumn);
198 inputColumnsToApply.clear();
199 inputColumnsToApply.push_back(outputColumnName);
201 std::string hashOperator = amILeftChildOfEqualLambda ?
"HASHLEFT" :
"HASHRIGHT";
202 outputTupleSetName = outputTupleSetName.append(
"_hashed");
203 outputColumnName = outputColumnName.append(
"_hash");
204 outputColumns.clear();
206 for (
const auto &inputColumnName : inputColumnNames) {
207 outputColumns.push_back(inputColumnName);
209 outputColumns.push_back(outputColumnName);
210 std::string computationNameWithLabel = computationName + std::to_string(computationLabel);
219 computationNameWithLabel,
221 std::map<std::string, std::string>());
224 for (
unsigned int i = 0; i < multiInputsComp->getNumInputs(); i++) {
225 std::string curInput = multiInputsComp->getNameForIthInput(i);
226 auto iter = std::find(outputColumns.begin(), outputColumns.end(), curInput);
227 if (iter != outputColumns.end()) {
228 multiInputsComp->setTupleSetNameForIthInput(i, outputTupleSetName);
229 multiInputsComp->setInputColumnsForIthInput(i, outputColumns);
230 multiInputsComp->setInputColumnsToApplyForIthInput(i, outputColumnName);
235 multiInputsComp->setTupleSetNameForIthInput(index, outputTupleSetName);
236 multiInputsComp->setInputColumnsForIthInput(index, outputColumns);
237 multiInputsComp->setInputColumnsToApplyForIthInput(index, outputColumnName);
248 std::map<std::string, std::string>
getInfo()
override {
251 return std::map<std::string, std::string>{
262 return input.getPtr();
268 TupleSpec &attsToIncludeInOutput)
override {
275 std::make_shared<TupleSetSetupMachine>(inputSchema, attsToIncludeInOutput);
278 std::vector<int> inputAtts = myMachine->match(attsToOperateOn);
279 int firstAtt = inputAtts[0];
282 int outAtt = attsToIncludeInOutput.
getAtts().size();
284 return std::make_shared<SimpleComputeExecutor>(
289 myMachine->setup(
input, output);
295 if (!output->hasColumn(outAtt)) {
296 std::vector<OutType> *outColumn =
new std::vector<OutType>;
297 output->addColumn(outAtt, outColumn,
true);
301 std::vector<OutType> &outColumn = output->getColumn<OutType>(outAtt);
304 int numTuples = inColumn.size();
305 outColumn.resize(numTuples);
306 for (
int i = 0; i < numTuples; i++) {
307 outColumn[i] = *inColumn[i];
312 "dereferenceLambda");
std::map< std::string, std::string > getInfo() override
DereferenceLambda(LambdaTree< Ptr< OutType >> &input)
std::vector< std::string > & getAtts()
GenericLambdaObjectPtr getChild(int which) override
std::string getTCAPString(const std::string &inputTupleSetName, const std::vector< std::string > &inputColumnNames, const std::vector< std::string > &inputColumnsToApply, const std::string &outputTupleSetName, const std::vector< std::string > &outputColumns, const std::string &outputColumnName, const std::string &tcapOperation, const std::string &computationNameAndLabel, const std::string &lambdaNameAndLabel, const std::map< std::string, std::string > &info)
std::shared_ptr< TupleSetSetupMachine > TupleSetSetupMachinePtr
LambdaTree< Ptr< OutType > > input
std::shared_ptr< GenericLambdaObject > GenericLambdaObjectPtr
std::string toTCAPString(std::vector< std::string > &inputTupleSetNames, std::vector< std::string > &inputColumnNames, std::vector< std::string > &inputColumnsToApply, std::vector< std::string > &childrenLambdaNames, int lambdaLabel, std::string computationName, int computationLabel, std::string &outputTupleSetName, std::vector< std::string > &outputColumns, std::string &outputColumnName, std::string &lambdaName, MultiInputsBase *multiInputsComp=nullptr, bool amIPartOfJoinPredicate=false, bool amILeftChildOfEqualLambda=false, bool amIRightChildOfEqualLambda=false, std::string parentLambdaName="", bool isSelfJoin=false) override
ComputeExecutorPtr getExecutor(TupleSpec &inputSchema, TupleSpec &attsToOperateOn, TupleSpec &attsToIncludeInOutput) override
std::shared_ptr< TupleSet > TupleSetPtr
std::shared_ptr< ComputeExecutor > ComputeExecutorPtr
std::string getTypeOfLambda() override
int getNumChildren() override
unsigned int getNumInputs() override
unsigned int getInputIndex(int i) override