35 template<
class MyType>
36 std::enable_if_t<std::is_base_of<PtrBase, MyType>::value,
size_t>
hashHim(MyType &him) {
40 template<
class MyType>
41 std::enable_if_t<!std::is_base_of<PtrBase, MyType>::value,
size_t>
hashHim(MyType &him) {
47 template<
class LHS,
class RHS>
48 std::enable_if_t<std::is_base_of<PtrBase, LHS>::value && std::is_base_of<PtrBase, RHS>::value,
bool>
55 template<
class LHS,
class RHS>
56 std::enable_if_t<std::is_base_of<PtrBase, LHS>::value && !(std::is_base_of<PtrBase, RHS>::value),
64 template<
class LHS,
class RHS>
65 std::enable_if_t<!(std::is_base_of<PtrBase, LHS>::value) && std::is_base_of<PtrBase, RHS>::value,
73 template<
class LHS,
class RHS>
74 std::enable_if_t<!(std::is_base_of<PtrBase, LHS>::value) && !(std::is_base_of<PtrBase, RHS>::value),
82 template<
class LeftType,
class RightType>
93 PDB_COUT <<
"EqualsLambda: LHS index is " << lhs.getInputIndex(0) << std::endl;
94 PDB_COUT <<
"EqualsLambda: RHS index is " << rhs.getInputIndex(0) << std::endl;
100 return std::string(
"==");
104 std::vector<std::string> &inputColumnNames,
105 std::vector<std::string> &inputColumnsToApply,
106 std::vector<std::string> &childrenLambdaNames,
108 std::string computationName,
109 int computationLabel,
110 std::string &outputTupleSetName,
111 std::vector<std::string> &outputColumns,
112 std::string &outputColumnName,
113 std::string &myLambdaName,
115 bool amIPartOfJoinPredicate =
false,
116 bool amILeftChildOfEqualLambda =
false,
117 bool amIRightChildOfEqualLambda =
false,
118 std::string parentLambdaName =
"",
119 bool isSelfJoin =
false)
override {
120 std::string tcapString;
122 std::string computationNameWithLabel = computationName +
"_" + std::to_string(computationLabel);
123 std::string inputTupleSetName;
124 if (multiInputsComp ==
nullptr) {
125 inputTupleSetName = inputTupleSetNames[0];
126 outputTupleSetName =
"equals_" + std::to_string(lambdaLabel) +
"OutFor" + computationName + std::to_string(computationLabel);
127 outputColumnName =
"bool_" + std::to_string(lambdaLabel) +
"_" + std::to_string(computationLabel);
128 outputColumns.clear();
129 for (
const auto &inputColumnName : inputColumnNames) {
130 outputColumns.push_back(inputColumnName);
132 outputColumns.push_back(outputColumnName);
134 tcapString +=
"\n/* Apply selection predicate on " + inputColumnsToApply[0] +
" and " + inputColumnsToApply[1] +
"*/\n";
142 computationNameWithLabel,
148 if (inputColumnNames[inputColumnNames.size() - 2] == inputColumnsToApply[0]) {
149 if (inputColumnNames.size() == 4) {
150 inputColumnNames[2] = inputColumnNames[1];
151 inputColumnNames[1] = inputColumnsToApply[0];
152 }
else if (inputColumnNames.size() == 3) {
153 inputColumnNames.push_back(inputColumnNames[2]);
154 inputColumnNames[2] = inputColumnNames[0];
156 std::cout <<
"Error: right now we can't support such complex join selection "
162 tcapString +=
"\n/* Join ( " + inputColumnNames[0];
163 for (
unsigned int i = 1; i < inputColumnNames.size() - 1; i++) {
164 if (inputColumnNames[i] == inputColumnsToApply[0]) {
165 tcapString +=
" ) and (";
167 tcapString +=
" " + inputColumnNames[i];
171 tcapString +=
" ) */\n";
172 outputTupleSetName =
"JoinedFor_equals" + std::to_string(lambdaLabel) +
173 computationName + std::to_string(computationLabel);
174 std::string tupleSetNamePrefix = outputTupleSetName;
175 outputColumns.clear();
178 for (
const auto &inputColumnName : inputColumnNames) {
179 auto iter = std::find(
180 inputColumnsToApply.begin(), inputColumnsToApply.end(), inputColumnName);
181 if (iter == inputColumnsToApply.end()) {
182 outputColumns.push_back(inputColumnName);
185 outputColumnName =
"";
187 tcapString += outputTupleSetName +
"(" + outputColumns[0];
188 for (
int i = 1; i < outputColumns.size(); i++) {
189 tcapString +=
", " + outputColumns[i];
191 tcapString +=
") <= JOIN (" + inputTupleSetNames[0] +
"(" + inputColumnsToApply[0] +
"), ";
192 tcapString += inputTupleSetNames[0] +
"(" + inputColumnNames[0];
194 for (
int i = 1; i < inputColumnNames.size(); i++) {
195 auto iter = std::find(
196 inputColumnsToApply.begin(), inputColumnsToApply.end(), inputColumnNames[i]);
197 if (iter != inputColumnsToApply.end()) {
201 tcapString +=
", " + inputColumnNames[i];
203 if (end1 + 1 >= inputColumnNames.size()) {
204 std::cout <<
"Can't generate TCAP for this query graph" << std::endl;
207 tcapString +=
"), " + inputTupleSetNames[1] +
"(" + inputColumnsToApply[1] +
"), " +
208 inputTupleSetNames[1] +
"(" + inputColumnNames[end1 + 1];
209 for (
int i = end1 + 2; i < inputColumnNames.size(); i++) {
210 auto iter = std::find(
211 inputColumnsToApply.begin(), inputColumnsToApply.end(), inputColumnNames[i]);
212 if (iter != inputColumnsToApply.end()) {
215 tcapString +=
", " + inputColumnNames[i];
218 tcapString +=
"), '" + computationNameWithLabel +
"')\n";
220 inputTupleSetName = outputTupleSetName;
221 inputColumnNames.clear();
222 for (
const auto &outputColumn : outputColumns) {
223 inputColumnNames.push_back(outputColumn);
225 inputColumnsToApply.clear();
226 inputColumnsToApply.push_back(multiInputsComp->getNameForIthInput(lhs.getInputIndex(0)));
227 outputColumnName =
"LHSExtractedFor_" + std::to_string(lambdaLabel) +
"_" + std::to_string(computationLabel);
228 outputColumns.push_back(outputColumnName);
229 outputTupleSetName = tupleSetNamePrefix +
"_WithLHSExtracted";
232 std::map<std::string, std::string> info;
241 computationNameWithLabel,
242 childrenLambdaNames[0],
245 inputTupleSetName = outputTupleSetName;
246 inputColumnNames.push_back(outputColumnName);
247 inputColumnsToApply.clear();
248 inputColumnsToApply.push_back(multiInputsComp->getNameForIthInput(rhs.getInputIndex(0)));
249 outputTupleSetName = tupleSetNamePrefix +
"_WithBOTHExtracted";
250 outputColumnName =
"RHSExtractedFor_" + std::to_string(lambdaLabel) +
"_" + std::to_string(computationLabel);
251 outputColumns.push_back(outputColumnName);
261 computationNameWithLabel,
262 childrenLambdaNames[1],
265 inputTupleSetName = outputTupleSetName;
266 inputColumnsToApply.clear();
267 inputColumnsToApply.push_back(
"LHSExtractedFor_" + std::to_string(lambdaLabel) +
"_" +
268 std::to_string(computationLabel));
269 inputColumnsToApply.push_back(
"RHSExtractedFor_" + std::to_string(lambdaLabel) +
"_" +
270 std::to_string(computationLabel));
271 inputColumnNames.pop_back();
273 "bool_" + std::to_string(lambdaLabel) +
"_" + std::to_string(computationLabel);
274 outputColumns.pop_back();
275 outputColumns.pop_back();
276 outputColumns.push_back(outputColumnName);
277 outputTupleSetName = tupleSetNamePrefix +
"_BOOL";
286 computationNameWithLabel,
290 inputTupleSetName = outputTupleSetName;
291 outputColumnName =
"";
292 outputColumns.pop_back();
293 outputTupleSetName = tupleSetNamePrefix +
"_FILTERED";
294 tcapString += outputTupleSetName +
"(" + outputColumns[0];
295 for (
int i = 1; i < outputColumns.size(); i++) {
296 tcapString +=
", " + outputColumns[i];
298 tcapString +=
") <= FILTER (" + inputTupleSetName +
"(bool_" +
299 std::to_string(lambdaLabel) +
"_" + std::to_string(computationLabel) +
"), " +
300 inputTupleSetName +
"(" + outputColumns[0];
301 for (
int i = 1; i < outputColumns.size(); i++) {
302 tcapString +=
", " + outputColumns[i];
304 tcapString +=
"), '" + computationNameWithLabel +
"')\n";
307 for (
unsigned int index = 0; index < multiInputsComp->getNumInputs(); index++) {
308 std::string curInput = multiInputsComp->getNameForIthInput(index);
309 auto iter = std::find(outputColumns.begin(), outputColumns.end(), curInput);
310 if (iter != outputColumns.end()) {
311 multiInputsComp->setTupleSetNameForIthInput(index, outputTupleSetName);
312 multiInputsComp->setInputColumnsForIthInput(index, outputColumns);
313 multiInputsComp->setInputColumnsToApplyForIthInput(index, outputColumnName);
325 std::map<std::string, std::string>
getInfo()
override {
328 return std::map<std::string, std::string>{
361 TupleSpec &attsToIncludeInOutput)
override {
368 std::make_shared<TupleSetSetupMachine>(inputSchema, attsToIncludeInOutput);
371 std::vector<int> inputAtts = myMachine->match(attsToOperateOn);
372 int firstAtt = inputAtts[0];
373 int secondAtt = inputAtts[1];
376 int outAtt = attsToIncludeInOutput.
getAtts().size();
378 return std::make_shared<SimpleComputeExecutor>(
383 myMachine->setup(input, output);
386 std::vector<LeftType> &leftColumn = input->getColumn<LeftType>(firstAtt);
387 std::vector<RightType> &rightColumn = input->getColumn<RightType>(secondAtt);
390 if (!output->hasColumn(outAtt)) {
391 std::vector<bool> *outColumn =
new std::vector<bool>;
392 output->addColumn(outAtt, outColumn,
true);
396 std::vector<bool> &outColumn = output->getColumn<
bool>(outAtt);
399 int numTuples = leftColumn.size();
400 outColumn.resize(numTuples);
402 for (
int i = 0; i < numTuples; i++) {
404 bool out =
checkEquals(leftColumn[i], rightColumn[i]);
417 TupleSpec &attsToIncludeInOutput)
override {
424 std::make_shared<TupleSetSetupMachine>(inputSchema, attsToIncludeInOutput);
427 std::vector<int> inputAtts = myMachine->match(attsToOperateOn);
428 int secondAtt = inputAtts[0];
431 int outAtt = attsToIncludeInOutput.
getAtts().size();
433 return std::make_shared<SimpleComputeExecutor>(
438 myMachine->setup(input, output);
441 std::vector<RightType> &rightColumn = input->getColumn<RightType>(secondAtt);
444 if (!output->hasColumn(outAtt)) {
445 std::vector<size_t> *outColumn =
new std::vector<size_t>;
446 output->addColumn(outAtt, outColumn,
true);
450 std::vector<size_t> &outColumn = output->getColumn<
size_t>(outAtt);
453 int numTuples = rightColumn.size();
454 outColumn.resize(numTuples);
455 for (
int i = 0; i < numTuples; i++) {
456 outColumn[i] =
hashHim(rightColumn[i]);
468 TupleSpec &attsToIncludeInOutput)
override {
475 std::make_shared<TupleSetSetupMachine>(inputSchema, attsToIncludeInOutput);
478 std::vector<int> inputAtts = myMachine->match(attsToOperateOn);
479 int firstAtt = inputAtts[0];
482 int outAtt = attsToIncludeInOutput.
getAtts().size();
484 return std::make_shared<SimpleComputeExecutor>(
489 myMachine->setup(input, output);
492 std::vector<LeftType> &leftColumn = input->getColumn<LeftType>(firstAtt);
495 if (!output->hasColumn(outAtt)) {
496 std::vector<size_t> *outColumn =
new std::vector<size_t>;
497 output->addColumn(outAtt, outColumn,
true);
501 std::vector<size_t> &outColumn = output->getColumn<
size_t>(outAtt);
504 int numTuples = leftColumn.size();
505 outColumn.resize(numTuples);
506 for (
int i = 0; i < numTuples; i++) {
507 outColumn[i] =
hashHim(leftColumn[i]);
std::vector< std::string > & getAtts()
ComputeExecutorPtr getRightHasher(TupleSpec &inputSchema, TupleSpec &attsToOperateOn, TupleSpec &attsToIncludeInOutput) override
std::enable_if_t< std::is_base_of< PtrBase, LHS >::value &&std::is_base_of< PtrBase, RHS >::value, bool > checkEquals(LHS &lhs, RHS &rhs)
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) 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::enable_if_t< std::is_base_of< PtrBase, MyType >::value, size_t > hashHim(MyType &him)
ComputeExecutorPtr getLeftHasher(TupleSpec &inputSchema, TupleSpec &attsToOperateOn, TupleSpec &attsToIncludeInOutput) override
EqualsLambda(LambdaTree< LeftType > lhsIn, LambdaTree< RightType > rhsIn)
int getNumChildren() override
std::shared_ptr< GenericLambdaObject > GenericLambdaObjectPtr
ComputeExecutorPtr getExecutor(TupleSpec &inputSchema, TupleSpec &attsToOperateOn, TupleSpec &attsToIncludeInOutput) override
std::string getTypeOfLambda() override
GenericLambdaObjectPtr getChild(int which) override
unsigned int getNumInputs() override
std::shared_ptr< TupleSet > TupleSetPtr
LambdaTree< LeftType > lhs
std::shared_ptr< ComputeExecutor > ComputeExecutorPtr
static auto hash(const KeyType &k) -> decltype(hash_impl(k, 0))
void setInputIndex(int i, unsigned int index)
LambdaTree< RightType > rhs
std::map< std::string, std::string > getInfo() override