19 #ifndef METHOD_CALL_LAM_H
20 #define METHOD_CALL_LAM_H
29 template<
class Out,
class ClassType>
33 std::function<ComputeExecutorPtr(TupleSpec &, TupleSpec &, TupleSpec &)>
getExecutorFunc;
51 inputTypeName(inputTypeName),
52 methodName(methodName),
53 returnTypeName(returnTypeName) {
55 PDB_COUT <<
"MethodCallLambda: input type code is " << input.getExactTypeInfoValue()
66 return std::string(
"methodCall");
85 std::string
toTCAPString(std::vector<std::string> &inputTupleSetNames,
86 std::vector<std::string> &inputColumnNames,
87 std::vector<std::string> &inputColumnsToApply,
88 std::vector<std::string> &childrenLambdaNames,
90 std::string computationName,
92 std::string &outputTupleSetName,
93 std::vector<std::string> &outputColumns,
94 std::string &outputColumnName,
95 std::string &lambdaName,
97 bool amIPartOfJoinPredicate =
false,
98 bool amILeftChildOfEqualLambda =
false,
99 bool amIRightChildOfEqualLambda =
false,
100 std::string parentLambdaName =
"",
101 bool isSelfJoin =
false)
override {
106 mustache::data lambdaData;
107 lambdaData.set(
"computationName", computationName);
108 lambdaData.set(
"computationLabel", std::to_string(computationLabel));
110 lambdaData.set(
"lambdaLabel", std::to_string(lambdaLabel));
113 mustache::mustache computationNameWithLabelTemplate{
"{{computationName}}_{{computationLabel}}"};
114 std::string computationNameWithLabel = computationNameWithLabelTemplate.render(lambdaData);
117 mustache::mustache lambdaNameTemplate{
"{{typeOfLambda}}_{{lambdaLabel}}"};
118 lambdaName = lambdaNameTemplate.render(lambdaData);
122 std::string inputTupleSetName;
123 std::string tupleSetMidTag;
124 std::string originalInputColumnToApply;
126 if (multiInputsComp ==
nullptr) {
127 tupleSetMidTag =
"OutFor_";
128 inputTupleSetName = inputTupleSetNames[0];
130 tupleSetMidTag =
"ExtractedFor_";
132 PDB_COUT << lambdaName <<
": myIndex=" << myIndex << std::endl;
133 inputTupleSetName = multiInputsComp->getTupleSetNameForIthInput(myIndex);
134 PDB_COUT <<
"inputTupleSetName=" << inputTupleSetName << std::endl;
135 inputColumnNames = multiInputsComp->getInputColumnsForIthInput(myIndex);
136 inputColumnsToApply.clear();
137 inputColumnsToApply.push_back(multiInputsComp->getNameForIthInput(myIndex));
138 originalInputColumnToApply = multiInputsComp->getNameForIthInput(myIndex);
139 PDB_COUT <<
"originalInputColumnToApply=" << originalInputColumnToApply << std::endl;
143 lambdaData.set(
"tupleSetMidTag", tupleSetMidTag);
144 lambdaData.set(
"methodName", methodName);
147 mustache::mustache outputTupleSetNameTemplate
148 {
"methodCall_{{lambdaLabel}}{{tupleSetMidTag}}{{computationName}}{{computationLabel}}"};
149 outputTupleSetName = outputTupleSetNameTemplate.render(lambdaData);
152 mustache::mustache outputColumnNameTemplate{
"methodCall_{{lambdaLabel}}{{tupleSetMidTag}}_{{methodName}}"};
153 outputColumnName = outputColumnNameTemplate.render(lambdaData);
156 outputColumns.clear();
157 for (
const auto &inputColumnName : inputColumnNames) {
158 outputColumns.push_back(inputColumnName);
160 outputColumns.push_back(outputColumnName);
163 std::map<std::string, std::string> info;
166 std::string tcapString;
174 computationNameWithLabel,
179 if (multiInputsComp ==
nullptr) {
183 if (amILeftChildOfEqualLambda || amIRightChildOfEqualLambda) {
184 inputTupleSetName = outputTupleSetName;
185 inputColumnNames.clear();
186 for (
const auto &outputColumn : outputColumns) {
188 if (outputColumn != outputColumnName) {
189 inputColumnNames.push_back(outputColumn);
192 inputColumnsToApply.clear();
193 inputColumnsToApply.push_back(outputColumnName);
195 std::string hashOperator = amILeftChildOfEqualLambda ?
"HASHLEFT" :
"HASHRIGHT";
196 outputTupleSetName = outputTupleSetName +
"_hashed";
197 outputColumnName = outputColumnName +
"_hash";
198 outputColumns.clear();
200 std::copy(inputColumnNames.begin(), inputColumnNames.end(), std::back_inserter(outputColumns));
201 outputColumns.push_back(outputColumnName);;
210 computationNameWithLabel,
212 std::map<std::string, std::string>());
215 for (
unsigned int index = 0; index < multiInputsComp->getNumInputs(); index++) {
216 std::string curInput = multiInputsComp->getNameForIthInput(index);
217 auto iter = std::find(outputColumns.begin(), outputColumns.end(), curInput);
218 if (iter != outputColumns.end()) {
219 PDB_COUT <<
"MultiInputBase for index=" << index <<
" is updated" << std::endl;
220 multiInputsComp->setTupleSetNameForIthInput(index, outputTupleSetName);
221 multiInputsComp->setInputColumnsForIthInput(index, outputColumns);
222 multiInputsComp->setInputColumnsToApplyForIthInput(index, outputColumnName);
224 if (originalInputColumnToApply == curInput) {
225 PDB_COUT <<
"MultiInputBase for index=" << index <<
" is updated" << std::endl;
226 multiInputsComp->setTupleSetNameForIthInput(index, outputTupleSetName);
227 multiInputsComp->setInputColumnsForIthInput(index, outputColumns);
228 multiInputsComp->setInputColumnsToApplyForIthInput(index, outputColumnName);
233 multiInputsComp->setTupleSetNameForIthInput(myIndex, outputTupleSetName);
234 multiInputsComp->setInputColumnsForIthInput(myIndex, outputColumns);
235 multiInputsComp->setInputColumnsToApplyForIthInput(myIndex, outputColumnName);
245 std::map<std::string, std::string>
getInfo()
override {
248 return std::map<std::string, std::string>{
250 std::make_pair (
"inputTypeName", inputTypeName),
251 std::make_pair (
"methodName", methodName),
252 std::make_pair (
"returnTypeName", returnTypeName)
266 TupleSpec &attsToIncludeInOutput)
override {
267 return getExecutorFunc(inputSchema, attsToOperateOn, attsToIncludeInOutput);
std::string inputTypeName
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::function< bool(std::string &, TupleSetPtr, int)> columnBuilder
std::function< ComputeExecutorPtr(TupleSpec &, TupleSpec &, TupleSpec &)> getExecutorFunc
std::shared_ptr< GenericLambdaObject > GenericLambdaObjectPtr
std::string getOutputType() override
std::shared_ptr< TupleSet > TupleSetPtr
GenericLambdaObjectPtr getChild(int which) override
virtual unsigned int getInputIndex(int i)
std::shared_ptr< ComputeExecutor > ComputeExecutorPtr
std::map< std::string, std::string > getInfo() override
std::string whichMethodWeCall()
unsigned int getNumInputs() override
int getNumChildren() override
std::string getInputType()
void setInputIndex(int i, unsigned int index)
ComputeExecutorPtr getExecutor(TupleSpec &inputSchema, TupleSpec &attsToOperateOn, TupleSpec &attsToIncludeInOutput) override
MethodCallLambda(std::string inputTypeName, std::string methodName, std::string returnTypeName, Handle< ClassType > &input, std::function< bool(std::string &, TupleSetPtr, int)> columnBuilder, std::function< ComputeExecutorPtr(TupleSpec &, TupleSpec &, TupleSpec &)> getExecutorFunc)
std::string getTypeOfLambda() override
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
std::string returnTypeName