A platform for high-performance distributed tool and library development written in C++. It can be deployed in two different cluster modes: standalone or distributed. API for v0.5.0, released on June 13, 2018.
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
AtomicComputationClasses.h
Go to the documentation of this file.
1 /*****************************************************************************
2  * *
3  * Copyright 2018 Rice University *
4  * *
5  * Licensed under the Apache License, Version 2.0 (the "License"); *
6  * you may not use this file except in compliance with the License. *
7  * You may obtain a copy of the License at *
8  * *
9  * http://www.apache.org/licenses/LICENSE-2.0 *
10  * *
11  * Unless required by applicable law or agreed to in writing, software *
12  * distributed under the License is distributed on an "AS IS" BASIS, *
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
14  * See the License for the specific language governing permissions and *
15  * limitations under the License. *
16  * *
17  *****************************************************************************/
18 
19 #ifndef COMP_CLASSES_H
20 #define COMP_CLASSES_H
21 
22 #include "TupleSpec.h"
23 #include "AtomicComputationList.h"
24 
25 #include "KeyValueList.h"
26 
27 // NOTE: these are NOT part of the pdb namespace because they need to be included in an "extern
28 // C"...
29 // I am not sure whether that is possible... perhaps we try moving them to the pdb namespace later.
30 
31 // this is a computation that applies a lambda to a tuple set
32 struct ApplyLambda : public AtomicComputation {
33 
34  private:
35  std::string lambdaName;
36 
37  public:
39 
51  std::string nodeName,
52  std::string lambdaNameIn)
53  : AtomicComputation(input, output, projection, nodeName), lambdaName(lambdaNameIn) {}
54 
68  std::string nodeName,
69  std::string lambdaNameIn,
70  KeyValueList &useMe) : AtomicComputation(input, output, projection, nodeName),
71  lambdaName(lambdaNameIn) {
72  // set the key value pairs
74  }
75 
76  std::string getAtomicComputationType() override {
77  return std::string("Apply");
78  }
79 
81  return ApplyLambdaTypeID;
82  }
83 
84  std::pair<std::string, std::string> findSource(std::string attName,
85  AtomicComputationList &allComps) override {
86 
87  // the output from the apply is:
88  //
89  // (set of projection atts) (new attribute created from apply)
90  //
91  // find where the attribute appears in the outputs
92  int counter = findPosInOutputAtts(attName);
93 
94  // if the attribute we are asking for is at the end (where the result of the lambda
95  // application goes)
96  // then we asked for it
97  if (counter == getOutput().getAtts().size() - 1) {
98  return std::make_pair(getComputationName(), lambdaName);
99  }
100 
101  // otherwise, find our parent
102  return allComps.getProducingAtomicComputation(getProjection().getSetName())
103  ->findSource((getProjection().getAtts())[counter], allComps);
104  }
105 
106  // returns the name of the lambda we are supposed to apply
107  std::string &getLambdaToApply() {
108  return lambdaName;
109  }
110 
111  friend std::ostream &operator<<(std::ostream &os, const AtomicComputationList &printMe);
112 };
113 
114 // this is a computation that applies a hash to a particular attribute in a tuple set
115 struct HashLeft : public AtomicComputation {
116 
117  private:
118  std::string lambdaName;
119 
120  public:
122 
124  TupleSpec &output,
126  std::string nodeName,
127  std::string lambdaNameIn)
128  : AtomicComputation(input, output, projection, nodeName), lambdaName(lambdaNameIn) {}
129 
130  // ss107: New Constructor:
132  TupleSpec &output,
134  std::string nodeName,
135  std::string lambdaNameIn,
136  KeyValueList &useMe) : AtomicComputation(input, output, projection, nodeName), lambdaName(lambdaNameIn) {
137 
138  // set the key value pairs
140  }
141 
142  std::string getAtomicComputationType() override {
143  return std::string("HashLeft");
144  }
145 
147  return HashLeftTypeID;
148  }
149 
150  // returns the name of the lambda we are supposed to apply
151  std::string &getLambdaToApply() {
152  return lambdaName;
153  }
154 
155  std::pair<std::string, std::string> findSource(std::string attName,
156  AtomicComputationList &allComps) override {
157 
158  // The output from the hash should be
159  //
160  // (projection atts) (hash value)
161  //
162 
163  // find where the attribute appears in the outputs
164  int counter = findPosInOutputAtts(attName);
165 
166  // if the attribute we are asking for is at the end (where the result of the lambda
167  // application goes)
168  // then we asked for it
169  if (counter == getOutput().getAtts().size() - 1) {
170  std::cout << "Why are you trying to find the origin of a hash value??\n";
171  exit(1);
172  }
173 
174  // otherwise, find our parent
175  return allComps.getProducingAtomicComputation(getProjection().getSetName())
176  ->findSource((getProjection().getAtts())[counter], allComps);
177  }
178 
179  friend std::ostream &operator<<(std::ostream &os, const AtomicComputationList &printMe);
180 };
181 
182 // this is a computation that applies a lambda to a tuple set
183 struct HashRight : public AtomicComputation {
184 
185  private:
186  std::string lambdaName;
187 
188  public:
190 
192  TupleSpec &output,
194  std::string nodeName,
195  std::string lambdaNameIn)
196  : AtomicComputation(input, output, projection, nodeName), lambdaName(lambdaNameIn) {}
197 
198  // ss107: New Constructor:
200  TupleSpec &output,
202  std::string nodeName,
203  std::string lambdaNameIn,
204  KeyValueList &useMe) :
205  AtomicComputation(input, output, projection, nodeName), lambdaName(lambdaNameIn) {
206 
207  // set the key value pairs
209  }
210 
211  std::string getAtomicComputationType() override {
212  return std::string("HashRight");
213  }
214 
216  return HashRightTypeID;
217  }
218 
219  // returns the name of the lambda we are supposed to apply
220  std::string &getLambdaToApply() {
221  return lambdaName;
222  }
223 
224  std::pair<std::string, std::string> findSource(std::string attName,
225  AtomicComputationList &allComps) override {
226 
227  // The output from the hash should be
228  //
229  // (projection atts) (hash value)
230  //
231 
232  // find where the attribute appears in the outputs
233  int counter = findPosInOutputAtts(attName);
234 
235  // if the attribute we are asking for is at the end (where the result of the lambda
236  // application goes)
237  // then we asked for it
238  if (counter == getOutput().getAtts().size() - 1) {
239  std::cout << "Why are you trying to find the origin of a hash value??\n";
240  exit(1);
241  }
242 
243  // otherwise, find our parent
244  return allComps.getProducingAtomicComputation(getProjection().getSetName())
245  ->findSource((getProjection().getAtts())[counter], allComps);
246  }
247 
248  friend std::ostream &operator<<(std::ostream &os, const AtomicComputationList &printMe);
249 };
250 
251 // this is a computation that adds 1 to each tuple of a tuple set
252 struct HashOne : public AtomicComputation {
253 
254  public:
255  ~HashOne() {}
256 
258  output,
259  projection,
260  nodeName) {}
261 
262  // ss107: New Constructor:
263  HashOne(TupleSpec &input, TupleSpec &output, TupleSpec &projection, std::string nodeName, KeyValueList &useMe) :
264  AtomicComputation(input, output, projection, nodeName) {
265 
266  // set the key value pairs
268  }
269 
270  std::string getAtomicComputationType() override {
271  return std::string("HashOne");
272  }
273 
275  return HashOneTypeID;
276  }
277 
278  std::pair<std::string, std::string> findSource(std::string attName,
279  AtomicComputationList &allComps) override {
280 
281  // The output from the hash should be
282  //
283  // (projection atts) (hash value)
284  //
285 
286  // find where the attribute appears in the outputs
287  int counter = findPosInOutputAtts(attName);
288 
289  // otherwise, find our parent
290  return allComps.getProducingAtomicComputation(getProjection().getSetName())
291  ->findSource((getProjection().getAtts())[counter], allComps);
292  }
293 
294  friend std::ostream &operator<<(std::ostream &os, const AtomicComputationList &printMe);
295 };
296 
297 // this is a computation that flatten each tuple of a tuple set
298 struct Flatten : public AtomicComputation {
299 
300  public:
301  ~Flatten() {}
302 
304  : AtomicComputation(input,
305  output,
306  projection,
307  nodeName) {}
308 
309  // ss107: New Constructor:
311  TupleSpec &output,
313  std::string nodeName,
314  KeyValueList &useMe) : AtomicComputation(input,
315  output,
316  projection,
317  nodeName) {
318  // set the key value pairs
320  }
321 
322  std::string getAtomicComputationType() override {
323  return std::string("Flatten");
324  }
325 
327  return FlattenTypeID;
328  }
329 
330  std::pair<std::string, std::string> findSource(std::string attName,
331  AtomicComputationList &allComps) override {
332 
333  // The output from the hash should be
334  //
335  // (projection atts) (hash value)
336  //
337  // std :: cout << "Flatten findSource for attName=" << attName << std :: endl;
338  // find where the attribute appears in the outputs
339  int counter = findPosInOutputAtts(attName);
340 
341  if (counter == getOutput().getAtts().size() - 1) {
342  return std::make_pair(getComputationName(), std::string(""));
343  }
344 
345  // otherwise, find our parent
346  // std :: cout << "Flatten projection set name is " << getProjection().getSetName() << std
347  // :: endl;
348 
349  // std :: cout << "Flatten getProjection is " << getProjection() << std :: endl;
350  return allComps.getProducingAtomicComputation(getProjection().getSetName())
351  ->findSource((getProjection().getAtts())[counter], allComps);
352  }
353 
354  friend std::ostream &operator<<(std::ostream &os, const AtomicComputationList &printMe);
355 };
356 
357 // this is a computation that performs a filer over a tuple set
359 
360  public:
362 
364  : AtomicComputation(input, output, projection, nodeName) {
365  // std :: cout << "Filter input tuple spec: " << input << ", output tuple spec: " << output
366  // << ", projection tuple spec: " << projection << std :: endl;
367  }
368 
369  // ss107: New Constructor:
370  ApplyFilter(TupleSpec &input, TupleSpec &output, TupleSpec &projection, std::string nodeName, KeyValueList &useMe) : AtomicComputation(input, output, projection, nodeName) {
371 
372  // set the key value pairs
374  }
375 
376  std::string getAtomicComputationType() override {
377  return std::string("Filter");
378  }
379 
381  return ApplyFilterTypeID;
382  }
383 
384  std::pair<std::string, std::string> findSource(std::string attName,
385  AtomicComputationList &allComps) override {
386 
387  // the output from the filter should be identical to the set of projection attributes
388  // find where the attribute appears in the outputs
389  int counter = findPosInOutputAtts(attName);
390 
391  // otherwise, find our parent
392  return allComps.getProducingAtomicComputation(getProjection().getSetName())
393  ->findSource((getProjection().getAtts())[counter], allComps);
394  }
395 };
396 
397 // this is a computation that aggregates a tuple set
398 struct ApplyAgg : public AtomicComputation {
399 
400  public:
402 
404  : AtomicComputation(input, output, projection, nodeName) {}
405 
406  // ss107: New Constructor:
407  ApplyAgg(TupleSpec &input, TupleSpec &output, TupleSpec &projection, std::string nodeName, KeyValueList &useMe) :
408  AtomicComputation(input, output, projection, nodeName) {
409 
410  // set the key value pairs
412  }
413 
414  std::string getAtomicComputationType() override {
415  return std::string("Aggregate");
416  }
417 
419  return ApplyAggTypeID;
420  }
421 
422  std::pair<std::string, std::string> findSource(std::string attName,
423  AtomicComputationList &allComps) override {
424 
425  // The output from the aggregate should be a single attribute
426  // find where the attribute appears in the outputs
427  int counter = findPosInOutputAtts(attName);
428 
429  // if the attribute we are asking for is at the end, it means it's produced by this
430  // aggregate
431  // then we asked for it
432  if (counter == 0) {
433  return std::make_pair(getComputationName(), std::string(""));
434  }
435 
436  // if it is not at the end, if makes no sense
437  std::cout << "How did we ever get here trying to find an attribute produced by an agg??\n";
438  exit(1);
439  }
440 };
441 
442 // this is a computation that produces a tuple set by scanning a set stored in the database
443 struct ScanSet : public AtomicComputation {
444 
445  std::string dbName;
446  std::string setName;
447 
448  public:
449  ~ScanSet() {}
450 
451  ScanSet(TupleSpec &output, std::string dbName, std::string setName, std::string nodeName)
452  : AtomicComputation(TupleSpec(), output, TupleSpec(), nodeName),
453  dbName(dbName),
454  setName(setName) {}
455 
456  // ss107: New Constructor:
457  ScanSet(TupleSpec &output, std::string dbName, std::string setName, std::string nodeName, KeyValueList &useMe) :
458  AtomicComputation(TupleSpec(), output, TupleSpec(), nodeName), dbName(dbName), setName(setName) {
459 
460  // set the key value pairs
462  }
463 
464  std::string getAtomicComputationType() override {
465  return std::string("Scan");
466  }
467 
469  return ScanSetAtomicTypeID;
470  }
471 
472  std::string &getDBName() {
473  return dbName;
474  }
475 
476  std::string &getSetName() {
477  return setName;
478  }
479 
480  std::pair<std::string, std::string> findSource(std::string attName,
481  AtomicComputationList &allComps) override {
482 
483  // The output from the scan should be a single attribute
484  // find where the attribute appears in the outputs
485  int counter = findPosInOutputAtts(attName);
486 
487  // if the attribute we are asking for is at the end (where the result of the lambda
488  // application goes)
489  // then we asked for it
490  if (counter == 0) {
491  return std::make_pair(getComputationName(), std::string(""));
492  }
493 
494  // if it is not at the end, if makes no sense
495  std::cout
496  << "How did we ever get here trying to find an attribute produced by a scan set??\n";
497  exit(1);
498  }
499 };
500 
501 // this is a computation that writes out a tuple set
502 struct WriteSet : public AtomicComputation {
503 
504  std::string dbName;
505  std::string setName;
506 
507  public:
509 
511  TupleSpec &output,
513  std::string dbName,
514  std::string setName,
515  std::string nodeName)
516  : AtomicComputation(input, output, projection, nodeName),
517  dbName(dbName),
518  setName(setName) {}
519 
520  // ss107: New Constructor:
522  TupleSpec &output,
524  std::string dbName,
525  std::string setName,
526  std::string nodeName,
527  KeyValueList &useMe) :
528  AtomicComputation(input, output, projection, nodeName), dbName(dbName), setName(setName) {
529 
530  // set the key value pairs
532  }
533 
534  std::string getAtomicComputationType() override {
535  return std::string("WriteSet");
536  }
537 
539  return WriteSetTypeID;
540  }
541 
542  std::string &getDBName() {
543  return dbName;
544  }
545 
546  std::string &getSetName() {
547  return setName;
548  }
549 
550  std::pair<std::string, std::string> findSource(std::string attName,
551  AtomicComputationList &allComps) override {
552  std::cout << "How did we ever get to a write set trying to find an attribute??\n";
553  exit(1);
554  }
555 };
556 
557 struct ApplyJoin : public AtomicComputation {
558 
561  // JiaNote: added below for physical planning
562  // if traversed is set to true, we know that one input has been processed, and the other input
563  // can go through the pipeline
564  bool traversed = false;
565  // JiaNote: added below for hash partitioned join
566  bool toPartitionLHS = false;
567 
568  public:
570  TupleSpec &lInput,
571  TupleSpec &rInput,
572  TupleSpec &lProjection,
573  TupleSpec &rProjection,
574  std::string nodeName)
575  : AtomicComputation(lInput, output, lProjection, nodeName),
576  rightInput(rInput),
577  rightProjection(rProjection) {
578  traversed = false;
579  toPartitionLHS = false;
580  }
581 
582  // ss107: New Constructor: Added Jia's correction too:
584  TupleSpec &lInput,
585  TupleSpec &rInput,
586  TupleSpec &lProjection,
587  TupleSpec &rProjection,
588  std::string nodeName,
589  KeyValueList &useMe) :
590  AtomicComputation(lInput, output, lProjection, nodeName), rightInput(rInput), rightProjection(rProjection) {
591 
592  // TODO this stuff is not used anymore will remove later when I refactor this
593  traversed = false;
594  toPartitionLHS = false;
595 
596  // set the key value pairs
598  }
599 
601  return rightProjection;
602  }
603 
605  return rightInput;
606  }
607 
608  std::string getAtomicComputationType() override {
609  return std::string("JoinSets");
610  }
611 
613  return ApplyJoinTypeID;
614  }
615 
616  bool isTraversed() {
617  return this->traversed;
618  }
619 
620  void setTraversed(bool traversed) {
621  this->traversed = traversed;
622  }
623 
625  return this->toPartitionLHS;
626  }
627 
629  this->toPartitionLHS = toPartitionLHS;
630  }
631 
632  std::pair<std::string, std::string> findSource(std::string attName,
633  AtomicComputationList &allComps) override {
634 
635  // The output from the join should be
636  //
637  // (left projection atts) (right projection atts)
638  //
639  // so find where the attribute in question came from
640  int counter = findPosInOutputAtts(attName);
641 
642  // if it came from the left, then we recurse and find it
643  if (counter < getProjection().getAtts().size()) {
644  return allComps.getProducingAtomicComputation(getProjection().getSetName())
645  ->findSource((getProjection().getAtts())[counter], allComps);
646 
647  // otherwise, if it came from the right, recurse and find it
648  } else if (counter < getProjection().getAtts().size() + rightProjection.getAtts().size()) {
650  ->findSource(
651  (rightProjection.getAtts())[counter - getProjection().getAtts().size()],
652  allComps);
653 
654  } else {
655  std::cout << "Why in the heck did we not find the producer when checking a join!!??\n";
656  exit(1);
657  }
658  }
659 };
660 
661 
662 // this is a computation that partitions a tuple set
664 
665  public:
667 
669  : AtomicComputation(input, output, projection, nodeName) {}
670 
672  AtomicComputation(input, output, projection, nodeName) {
673 
674  // set the key value pairs
676  }
677 
678  std::string getAtomicComputationType() override {
679  return std::string("Partition");
680  }
681 
683  return ApplyPartitionTypeID;
684  }
685 
686  std::pair<std::string, std::string> findSource(std::string attName,
687  AtomicComputationList &allComps) override {
688 
689  // The output from the partition should be a single attribute
690  // find where the attribute appears in the outputs
691  int counter = findPosInOutputAtts(attName);
692 
693  // if the attribute we are asking for is at the end, it means it's produced by this
694  // aggregate
695  // then we asked for it
696  if (counter == 0) {
697  return std::make_pair(getComputationName(), std::string(""));
698  }
699 
700  // if it is not at the end, if makes no sense
701  std::cout << "How did we ever get here trying to find an attribute produced by an agg??\n";
702  exit(1);
703  }
704 };
705 
706 
707 #endif
std::string setName
ApplyLambda(TupleSpec &input, TupleSpec &output, TupleSpec &projection, std::string nodeName, std::string lambdaNameIn, KeyValueList &useMe)
HashOne(TupleSpec &input, TupleSpec &output, TupleSpec &projection, std::string nodeName)
std::string getAtomicComputationType() override
ApplyJoin(TupleSpec &output, TupleSpec &lInput, TupleSpec &rInput, TupleSpec &lProjection, TupleSpec &rProjection, std::string nodeName, KeyValueList &useMe)
AtomicComputationTypeID
std::string dbName
std::shared_ptr< std::map< std::string, std::string > > keyValuePairs
ApplyFilter(TupleSpec &input, TupleSpec &output, TupleSpec &projection, std::string nodeName)
std::pair< std::string, std::string > findSource(std::string attName, AtomicComputationList &allComps) override
std::string getAtomicComputationType() override
std::vector< std::string > & getAtts()
Definition: TupleSpec.h:60
TupleSpec & getRightInput()
std::string & getComputationName()
Flatten(TupleSpec &input, TupleSpec &output, TupleSpec &projection, std::string nodeName, KeyValueList &useMe)
std::string getAtomicComputationType() override
std::pair< std::string, std::string > findSource(std::string attName, AtomicComputationList &allComps) override
std::pair< std::string, std::string > findSource(std::string attName, AtomicComputationList &allComps) override
TupleSpec & getOutput()
AtomicComputationTypeID getAtomicComputationTypeID() override
std::pair< std::string, std::string > findSource(std::string attName, AtomicComputationList &allComps) override
ApplyPartition(TupleSpec &input, TupleSpec &output, TupleSpec &projection, std::string nodeName)
std::pair< std::string, std::string > findSource(std::string attName, AtomicComputationList &allComps) override
ApplyJoin(TupleSpec &output, TupleSpec &lInput, TupleSpec &rInput, TupleSpec &lProjection, TupleSpec &rProjection, std::string nodeName)
std::pair< std::string, std::string > findSource(std::string attName, AtomicComputationList &allComps) override
AtomicComputationTypeID getAtomicComputationTypeID() override
std::shared_ptr< std::map< std::string, std::string > > & getKeyValuePairs()
Definition: KeyValueList.h:51
AtomicComputationTypeID getAtomicComputationTypeID() override
friend std::ostream & operator<<(std::ostream &os, const AtomicComputationList &printMe)
std::string & getSetName()
Definition: TupleSpec.h:56
std::pair< std::string, std::string > findSource(std::string attName, AtomicComputationList &allComps) override
std::string getAtomicComputationType() override
std::pair< std::string, std::string > findSource(std::string attName, AtomicComputationList &allComps) override
AtomicComputationTypeID getAtomicComputationTypeID() override
AtomicComputationPtr getProducingAtomicComputation(std::string outputName)
ApplyAgg(TupleSpec &input, TupleSpec &output, TupleSpec &projection, std::string nodeName, KeyValueList &useMe)
HashLeft(TupleSpec &input, TupleSpec &output, TupleSpec &projection, std::string nodeName, std::string lambdaNameIn, KeyValueList &useMe)
std::string getAtomicComputationType() override
std::string getAtomicComputationType() override
AtomicComputationTypeID getAtomicComputationTypeID() override
int findPosInOutputAtts(std::string &findMe)
std::string getAtomicComputationType() override
AtomicComputationTypeID getAtomicComputationTypeID() override
AtomicComputationTypeID getAtomicComputationTypeID() override
std::string & getSetName()
AtomicComputationTypeID getAtomicComputationTypeID() override
std::pair< std::string, std::string > findSource(std::string attName, AtomicComputationList &allComps) override
std::string getAtomicComputationType() override
Flatten(TupleSpec &input, TupleSpec &output, TupleSpec &projection, std::string nodeName)
friend std::ostream & operator<<(std::ostream &os, const AtomicComputationList &printMe)
HashOne(TupleSpec &input, TupleSpec &output, TupleSpec &projection, std::string nodeName, KeyValueList &useMe)
std::string getAtomicComputationType() override
friend std::ostream & operator<<(std::ostream &os, const AtomicComputationList &printMe)
TupleSpec & getProjection()
std::string lambdaName
AtomicComputationTypeID getAtomicComputationTypeID() override
std::string & getLambdaToApply()
std::string & getLambdaToApply()
friend std::ostream & operator<<(std::ostream &os, const AtomicComputationList &printMe)
ApplyAgg(TupleSpec &input, TupleSpec &output, TupleSpec &projection, std::string nodeName)
ApplyFilter(TupleSpec &input, TupleSpec &output, TupleSpec &projection, std::string nodeName, KeyValueList &useMe)
std::string & getDBName()
std::string & getSetName()
std::pair< std::string, std::string > findSource(std::string attName, AtomicComputationList &allComps) override
TupleSpec & getRightProjection()
std::string getAtomicComputationType() override
std::pair< std::string, std::string > findSource(std::string attName, AtomicComputationList &allComps) override
AtomicComputationTypeID getAtomicComputationTypeID() override
std::string getAtomicComputationType() override
std::string & getDBName()
HashLeft(TupleSpec &input, TupleSpec &output, TupleSpec &projection, std::string nodeName, std::string lambdaNameIn)
ApplyPartition(TupleSpec &input, TupleSpec &output, TupleSpec &projection, std::string nodeName, KeyValueList &useMe)
ScanSet(TupleSpec &output, std::string dbName, std::string setName, std::string nodeName, KeyValueList &useMe)
ApplyLambda(TupleSpec &input, TupleSpec &output, TupleSpec &projection, std::string nodeName, std::string lambdaNameIn)
HashRight(TupleSpec &input, TupleSpec &output, TupleSpec &projection, std::string nodeName, std::string lambdaNameIn)
AtomicComputationTypeID getAtomicComputationTypeID() override
friend std::ostream & operator<<(std::ostream &os, const AtomicComputationList &printMe)
WriteSet(TupleSpec &input, TupleSpec &output, TupleSpec &projection, std::string dbName, std::string setName, std::string nodeName, KeyValueList &useMe)
void setTraversed(bool traversed)
HashRight(TupleSpec &input, TupleSpec &output, TupleSpec &projection, std::string nodeName, std::string lambdaNameIn, KeyValueList &useMe)
WriteSet(TupleSpec &input, TupleSpec &output, TupleSpec &projection, std::string dbName, std::string setName, std::string nodeName)
ScanSet(TupleSpec &output, std::string dbName, std::string setName, std::string nodeName)
void setPartitioningLHS(bool toPartitionLHS)
std::string lambdaName
std::string & getLambdaToApply()