19 #ifndef LAMBDA_HELPER_H
20 #define LAMBDA_HELPER_H
26 #include <mustache_helper.h>
92 return (
unsigned int) (-1);
127 return getExecutor(inputSchema, attsToOperateOn, attsToIncludeInOutput);
140 std::cout <<
"getLeftHasher not implemented for this type!!\n";
155 return getLeftHasher(inputSchema, attsToOperateOn, attsToIncludeInOutput);
168 std::cout <<
"getRightHasher not implemented for this type!!\n";
183 return getRightHasher(inputSchema, attsToOperateOn, attsToIncludeInOutput);
241 const std::vector<std::string> &inputColumnNames,
242 const std::vector<std::string> &inputColumnsToApply,
243 const std::string &outputTupleSetName,
244 const std::vector<std::string> &outputColumns,
245 const std::string &outputColumnName,
246 const std::string &tcapOperation,
247 const std::string &computationNameAndLabel,
248 const std::string &lambdaNameAndLabel,
249 const std::map<std::string, std::string> &info) {
251 mustache::mustache outputTupleSetNameTemplate{
"{{outputTupleSetName}}({{#outputColumns}}{{value}}{{^isLast}},{{/isLast}}{{/outputColumns}}) <= "
252 "{{tcapOperation}} ({{inputTupleSetName}}({{#inputColumnsToApply}}{{value}}{{^isLast}},{{/isLast}}{{/inputColumnsToApply}}), "
253 "{{inputTupleSetName}}({{#hasColumnNames}}{{#inputColumnNames}}{{value}}{{^isLast}},{{/isLast}}{{/inputColumnNames}}{{/hasColumnNames}}), "
254 "'{{computationNameAndLabel}}', "
255 "{{#hasLambdaNameAndLabel}}'{{lambdaNameAndLabel}}', {{/hasLambdaNameAndLabel}}"
256 "[{{#info}}('{{key}}', '{{value}}'){{^isLast}}, {{/isLast}}{{/info}}])\n"};
259 mustache::data outputColumnData = mustache::from_vector<std::string>(outputColumns);
262 mustache::data inputColumnsToApplyData = mustache::from_vector<std::string>(inputColumnsToApply);
265 mustache::data inputColumnNamesData = mustache::from_vector<std::string>(inputColumnNames);
268 mustache::data infoData = mustache::from_map(info);
271 mustache::data lambdaData;
273 lambdaData.set(
"outputTupleSetName", outputTupleSetName);
274 lambdaData.set(
"outputColumns", outputColumnData);
275 lambdaData.set(
"tcapOperation", tcapOperation);
276 lambdaData.set(
"inputTupleSetName", inputTupleSetName);
277 lambdaData.set(
"inputColumnsToApply", inputColumnsToApplyData);
278 lambdaData.set(
"hasColumnNames", !inputColumnNames.empty());
279 lambdaData.set(
"inputColumnNames", inputColumnNamesData);
280 lambdaData.set(
"inputTupleSetName", inputTupleSetName);
281 lambdaData.set(
"computationNameAndLabel", computationNameAndLabel);
282 lambdaData.set(
"hasLambdaNameAndLabel", !lambdaNameAndLabel.empty());
283 lambdaData.set(
"lambdaNameAndLabel", lambdaNameAndLabel);
284 lambdaData.set(
"info", infoData);
286 return outputTupleSetNameTemplate.render(lambdaData);
302 std::string computationName,
303 int computationLabel,
304 std::string &outputTupleSetName,
305 std::vector<std::string> &outputColumns,
306 std::string &outputColumnName,
307 std::string &myLambdaName,
309 std::cout <<
"toTCAPStringForCartesianJoin() should not be implemented here!" << std::endl;
339 virtual std::string
toTCAPString(std::vector<std::string> &inputTupleSetNames,
340 std::vector<std::string> &inputColumnNames,
341 std::vector<std::string> &inputColumnsToApply,
342 std::vector<std::string> &childrenLambdaNames,
344 std::string computationName,
345 int computationLabel,
346 std::string &outputTupleSetName,
347 std::vector<std::string> &outputColumns,
348 std::string &outputColumnName,
349 std::string &myLambdaName,
351 bool amIPartOfJoinPredicate =
false,
352 bool amILeftChildOfEqualLambda =
false,
353 bool amIRightChildOfEqualLambda =
false,
354 std::string parentLambdaName =
"",
355 bool isSelfJoin =
false) {
356 std::string tcapString;
358 if ((lambdaType.find(
"==") != std::string::npos) ||
359 (lambdaType.find(
"&&") != std::string::npos)) {
363 if ((lambdaType.find(
"native_lambda") != std::string::npos) && (multiInputsComp !=
nullptr)
364 && amIPartOfJoinPredicate &&
365 !amIRightChildOfEqualLambda
366 && ((parentLambdaName.empty()) || (parentLambdaName.find(
"&&") != std::string::npos))) {
378 std::string computationNameWithLabel = computationName +
"_" + std::to_string(computationLabel);
380 std::string inputTupleSetName = inputTupleSetNames[0];
381 std::string tupleSetMidTag =
"OutFor";
383 std::vector<std::string> originalInputColumnsToApply;
386 if (multiInputsComp !=
nullptr) {
387 if (amILeftChildOfEqualLambda || amIRightChildOfEqualLambda) {
388 tupleSetMidTag =
"Extracted";
391 PDB_COUT << myLambdaName +
": myIndex=" << myIndex << std::endl;
392 inputTupleSetName = multiInputsComp->getTupleSetNameForIthInput(myIndex);
393 PDB_COUT <<
"inputTupleSetName=" << inputTupleSetName << std::endl;
394 inputColumnNames = multiInputsComp->getInputColumnsForIthInput(myIndex);
396 inputColumnsToApply.clear();
399 inputColumnsToApply.push_back(multiInputsComp->getNameForIthInput(myIndex));
400 originalInputColumnsToApply.push_back(multiInputsComp->getNameForIthInput(myIndex));
404 inputColumnsToApply.push_back(multiInputsComp->getNameForIthInput(index));
405 originalInputColumnsToApply.push_back(
406 multiInputsComp->getNameForIthInput(myIndex));
409 multiInputsComp->setLambdasForIthInputAndPredicate(
410 myIndex, parentLambdaName, myLambdaName);
413 PDB_COUT <<
"input columns to apply: " << std::endl;
414 for (
const auto &i : originalInputColumnsToApply) {
418 outputTupleSetName = lambdaType.substr(0, 5) +
"_" + std::to_string(lambdaLabel) + tupleSetMidTag + computationName
419 + std::to_string(computationLabel);
421 lambdaType.substr(0, 5) +
"_" + std::to_string(lambdaLabel) +
"_" + std::to_string(computationLabel)
424 outputColumns.clear();
425 for (
const auto &inputColumnName : inputColumnNames) {
426 outputColumns.push_back(inputColumnName);
428 outputColumns.push_back(outputColumnName);
431 std::map<std::string, std::string> info;
443 computationNameWithLabel,
447 if (multiInputsComp !=
nullptr) {
448 if (amILeftChildOfEqualLambda || amIRightChildOfEqualLambda) {
449 inputTupleSetName = outputTupleSetName;
450 inputColumnNames.clear();
451 for (
const auto &outputColumn : outputColumns) {
453 if (outputColumn != outputColumnName) {
454 inputColumnNames.push_back(outputColumn);
457 inputColumnsToApply.clear();
458 inputColumnsToApply.push_back(outputColumnName);
460 std::string hashOperator;
461 if (amILeftChildOfEqualLambda) {
462 hashOperator =
"HASHLEFT";
464 hashOperator =
"HASHRIGHT";
466 outputTupleSetName = outputTupleSetName +
"_hashed";
467 outputColumnName = outputColumnName +
"_hash";
468 outputColumns.clear();
470 for (
const auto &inputColumnName : inputColumnNames) {
471 outputColumns.push_back(inputColumnName);
473 outputColumns.push_back(outputColumnName);
482 computationNameWithLabel,
484 std::map<std::string, std::string>());
487 for (
unsigned int index = 0; index < multiInputsComp->getNumInputs(); index++) {
488 std::string curInput = multiInputsComp->getNameForIthInput(index);
489 PDB_COUT <<
"curInput is " << curInput << std::endl;
490 auto iter = std::find(outputColumns.begin(), outputColumns.end(), curInput);
491 if (iter != outputColumns.end()) {
492 PDB_COUT <<
"MultiInputsBase with index=" << index <<
" is updated."
494 multiInputsComp->setTupleSetNameForIthInput(index, outputTupleSetName);
495 multiInputsComp->setInputColumnsForIthInput(index, outputColumns);
496 multiInputsComp->setInputColumnsToApplyForIthInput(index, outputColumnName);
499 auto iter1 = std::find(originalInputColumnsToApply.begin(),
500 originalInputColumnsToApply.end(),
502 if (iter1 != originalInputColumnsToApply.end()) {
503 PDB_COUT <<
"MultiInputsBase with index=" << index <<
" is updated."
505 multiInputsComp->setTupleSetNameForIthInput(index, outputTupleSetName);
506 multiInputsComp->setInputColumnsForIthInput(index, outputColumns);
507 multiInputsComp->setInputColumnsToApplyForIthInput(index, outputColumnName);
512 multiInputsComp->setTupleSetNameForIthInput(myIndex, outputTupleSetName);
513 multiInputsComp->setInputColumnsForIthInput(myIndex, outputColumns);
514 multiInputsComp->setInputColumnsToApplyForIthInput(myIndex, outputColumnName);
524 virtual std::map<std::string, std::string>
getInfo() = 0;
537 template<
typename Out>
545 return getTypeName<Out>();
virtual ComputeExecutorPtr getLeftHasher(TupleSpec &inputSchema, TupleSpec &attsToOperateOn, TupleSpec &attsToIncludeInOutput)
std::string getOutputType() override
virtual ComputeExecutorPtr getRightHasher(TupleSpec &inputSchema, TupleSpec &attsToOperateOn, TupleSpec &attsToIncludeInOutput, ComputeInfoPtr)
virtual ComputeExecutorPtr getLeftHasher(TupleSpec &inputSchema, TupleSpec &attsToOperateOn, TupleSpec &attsToIncludeInOutput, ComputeInfoPtr)
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)
virtual GenericLambdaObjectPtr getChild(int which)=0
std::shared_ptr< ComputeInfo > ComputeInfoPtr
virtual ComputeExecutorPtr getExecutor(TupleSpec &inputSchema, TupleSpec &attsToOperateOn, TupleSpec &attsToIncludeInOutput)=0
std::shared_ptr< GenericLambdaObject > GenericLambdaObjectPtr
virtual std::string getTypeOfLambda()=0
std::vector< unsigned int > inputIndexes
virtual unsigned int getNumInputs()=0
virtual ~TypedLambdaObject()=default
virtual unsigned int getInputIndex(int i)
virtual std::string getOutputType()=0
std::shared_ptr< ComputeExecutor > ComputeExecutorPtr
virtual std::string toTCAPStringForCartesianJoin(int lambdaLabel, std::string computationName, int computationLabel, std::string &outputTupleSetName, std::vector< std::string > &outputColumns, std::string &outputColumnName, std::string &myLambdaName, MultiInputsBase *multiInputsComp)
virtual ~GenericLambdaObject()=default
virtual ComputeExecutorPtr getRightHasher(TupleSpec &inputSchema, TupleSpec &attsToOperateOn, TupleSpec &attsToIncludeInOutput)
virtual int getNumChildren()=0
void setInputIndex(int i, unsigned int index)
virtual std::map< std::string, std::string > getInfo()=0
virtual ComputeExecutorPtr getExecutor(TupleSpec &inputSchema, TupleSpec &attsToOperateOn, TupleSpec &attsToIncludeInOutput, ComputeInfoPtr)
virtual 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 &myLambdaName, MultiInputsBase *multiInputsComp=nullptr, bool amIPartOfJoinPredicate=false, bool amILeftChildOfEqualLambda=false, bool amIRightChildOfEqualLambda=false, std::string parentLambdaName="", bool isSelfJoin=false)