19 #ifndef ATT_ACCESS_LAM_H
20 #define ATT_ACCESS_LAM_H
33 template<
class Out,
class ClassType>
44 std::string attNameIn,
57 return std::string(
"attAccess");
76 std::string
toTCAPString(std::vector<std::string> &inputTupleSetNames,
77 std::vector<std::string> &inputColumnNames,
78 std::vector<std::string> &inputColumnsToApply,
79 std::vector<std::string> &childrenLambdaNames,
81 std::string computationName,
83 std::string &outputTupleSetName,
84 std::vector<std::string> &outputColumns,
85 std::string &outputColumnName,
86 std::string &lambdaName,
88 bool amIPartOfJoinPredicate =
false,
89 bool amILeftChildOfEqualLambda =
false,
90 bool amIRightChildOfEqualLambda =
false,
91 std::string parentLambdaName =
"",
92 bool isSelfJoin =
false)
override {
95 mustache::data lambdaData;
96 lambdaData.set(
"computationName", computationName);
97 lambdaData.set(
"computationLabel", std::to_string(computationLabel));
99 lambdaData.set(
"lambdaLabel", std::to_string(lambdaLabel));
102 mustache::mustache computationNameWithLabelTemplate{
"{{computationName}}_{{computationLabel}}"};
103 std::string computationNameWithLabel = computationNameWithLabelTemplate.render(lambdaData);
106 mustache::mustache lambdaNameTemplate{
"{{typeOfLambda}}_{{lambdaLabel}}"};
107 lambdaName = lambdaNameTemplate.render(lambdaData);
111 std::string inputTupleSetName;
112 std::string tupleSetMidTag;
113 std::string originalInputColumnToApply;
115 if (multiInputsComp ==
nullptr) {
116 tupleSetMidTag =
"OutFor";
117 inputTupleSetName = inputTupleSetNames[0];
119 tupleSetMidTag =
"ExtractedFor";
121 PDB_COUT << lambdaName <<
": myIndex=" << index << std::endl;
122 inputTupleSetName = multiInputsComp->getTupleSetNameForIthInput(index);
123 PDB_COUT <<
"inputTupleSetName=" << inputTupleSetName << std::endl;
124 inputColumnNames = multiInputsComp->getInputColumnsForIthInput(index);
125 inputColumnsToApply.clear();
126 inputColumnsToApply.push_back(multiInputsComp->getNameForIthInput(index));
127 originalInputColumnToApply = multiInputsComp->getNameForIthInput(index);
128 PDB_COUT <<
"originalInputColumnToApply=" << originalInputColumnToApply << std::endl;
132 lambdaData.set(
"tupleSetMidTag", tupleSetMidTag);
133 lambdaData.set(
"attName",
attName);
136 mustache::mustache outputTupleSetNameTemplate{
"attAccess_{{lambdaLabel}}{{tupleSetMidTag}}{{computationName}}{{computationLabel}}"};
137 outputTupleSetName = outputTupleSetNameTemplate.render(lambdaData);
140 mustache::mustache outputColumnNameTemplate{
"att_{{lambdaLabel}}{{tupleSetMidTag}}_{{attName}}"};
141 outputColumnName = outputColumnNameTemplate.render(lambdaData);
144 outputColumns.clear();
145 for (
const auto &inputColumnName : inputColumnNames) {
146 outputColumns.push_back(inputColumnName);
148 outputColumns.push_back(outputColumnName);
151 std::string tcapString;
154 std::map<std::string, std::string> info;
163 computationNameWithLabel,
167 if (multiInputsComp !=
nullptr) {
168 if (amILeftChildOfEqualLambda || amIRightChildOfEqualLambda) {
169 inputTupleSetName = outputTupleSetName;
170 inputColumnNames.clear();
171 for (
const auto &outputColumn : outputColumns) {
173 if (outputColumn != outputColumnName) {
174 inputColumnNames.push_back(outputColumn);
177 inputColumnsToApply.clear();
178 inputColumnsToApply.push_back(outputColumnName);
180 std::string hashOperator = amILeftChildOfEqualLambda ?
"HASHLEFT" :
"HASHRIGHT";
181 outputTupleSetName = outputTupleSetName.append(
"_hashed");
182 outputColumnName = outputColumnName.append(
"_hash");
183 outputColumns.clear();
185 std::copy(inputColumnNames.begin(), inputColumnNames.end(), std::back_inserter(outputColumns));
186 outputColumns.push_back(outputColumnName);
195 computationNameWithLabel,
197 std::map<std::string, std::string>());
201 for (
unsigned int i = 0; i < multiInputsComp->getNumInputs(); i++) {
202 std::string curInput = multiInputsComp->getNameForIthInput(i);
203 auto iter = std::find(outputColumns.begin(), outputColumns.end(), curInput);
204 if (iter != outputColumns.end()) {
205 PDB_COUT <<
"MultiInputBase for index=" << i <<
" is updated" << std::endl;
206 multiInputsComp->setTupleSetNameForIthInput(i, outputTupleSetName);
207 multiInputsComp->setInputColumnsForIthInput(i, outputColumns);
208 multiInputsComp->setInputColumnsToApplyForIthInput(i, outputColumnName);
210 if (originalInputColumnToApply == curInput) {
211 PDB_COUT <<
"MultiInputBase for index=" << i <<
" is updated" << std::endl;
212 multiInputsComp->setTupleSetNameForIthInput(i, outputTupleSetName);
213 multiInputsComp->setInputColumnsForIthInput(i, outputColumns);
214 multiInputsComp->setInputColumnsToApplyForIthInput(i, outputColumnName);
219 multiInputsComp->setTupleSetNameForIthInput(index, outputTupleSetName);
220 multiInputsComp->setInputColumnsForIthInput(index, outputColumns);
221 multiInputsComp->setInputColumnsToApplyForIthInput(index, outputColumnName);
232 std::map<std::string, std::string>
getInfo()
override {
235 return std::map<std::string, std::string>{
239 std::make_pair (
"attName",
attName),
254 TupleSpec &attsToIncludeInOutput)
override {
261 std::make_shared<TupleSetSetupMachine>(inputSchema, attsToIncludeInOutput);
264 std::vector<int> matches = myMachine->match(attsToOperateOn);
265 int whichAtt = matches[0];
268 int outAtt = attsToIncludeInOutput.
getAtts().size();
270 return std::make_shared<SimpleComputeExecutor>(
275 myMachine->setup(input, output);
278 std::vector<Handle<ClassType>> &inputColumn =
282 if (!output->hasColumn(outAtt)) {
283 std::vector<Ptr<Out>> *outputCol =
new std::vector<Ptr<Out>>;
284 output->addColumn(outAtt, outputCol,
true);
288 std::vector<Ptr<Out>> &outColumn = output->getColumn<
Ptr<Out>>(outAtt);
291 int numTuples = inputColumn.size();
292 outColumn.resize(numTuples);
293 for (
int i = 0; i < numTuples; i++) {
std::string getInputType()
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
std::string inputTypeName
AttAccessLambda(std::string inputTypeNameIn, std::string attNameIn, std::string attType, Handle< ClassType > &input, size_t offset)
std::shared_ptr< GenericLambdaObject > GenericLambdaObjectPtr
ComputeExecutorPtr getExecutor(TupleSpec &inputSchema, TupleSpec &attsToOperateOn, TupleSpec &attsToIncludeInOutput) override
std::string getTypeOfLambda() override
std::shared_ptr< TupleSet > TupleSetPtr
virtual unsigned int getInputIndex(int i)
std::shared_ptr< ComputeExecutor > ComputeExecutorPtr
unsigned int getNumInputs() override
std::string whichAttWeProcess()
void setInputIndex(int i, unsigned int index)
std::map< std::string, std::string > getInfo() override
size_t offsetOfAttToProcess
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
int getNumChildren() override