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
WriteUserSetBase.h
Go to the documentation of this file.
1 //
2 // Created by dimitrije on 3/17/18.
3 //
4 
5 #ifndef PDB_WRITEUSERSETBASE_H
6 #define PDB_WRITEUSERSETBASE_H
7 
8 #include "Computation.h"
9 #include "VectorSink.h"
10 #include "PDBString.h"
11 #include "TypeName.h"
12 #include "mustache.h"
13 
14 namespace pdb {
15 
16 template <class OutputClass>
17 class WriteUserSetBase : public Computation {
18 
19 public:
20 
29  WriteUserSetBase () = default;
30 
36  WriteUserSetBase (std :: string dbName, std :: string setName) {
37  this->dbName = dbName;
38  this->setName = setName;
39  this->outputType = getTypeName<OutputClass>();
40  }
41 
47  void setUpAndCopyFrom(void* target, void* source) const override {
48  new (target) WriteUserSetBase<OutputClass> ();
51 
52  toMe.outputType = fromMe.outputType;
53  toMe.dbName = fromMe.dbName;
54  toMe.setName = fromMe.setName;
55  }
56 
61  void deleteObject(void* deleteMe) override {
62  deleter(deleteMe, this);
63  }
64 
70  size_t getSize(void* forMe) override {
71  return sizeof(WriteUserSetBase<OutputClass>);
72  }
73 
81  ComputeSinkPtr getComputeSink(TupleSpec& consumeMe, TupleSpec& projection, ComputePlan& plan) override {
82  return std::make_shared<VectorSink<OutputClass>>(consumeMe, projection);
83  }
84 
90  void setOutput(std::string dbName, std::string setName) override {
91  this->dbName = dbName;
92  this->setName = setName;
93  }
94 
99  void setDatabaseName(std::string dbName) {
100  this->dbName = dbName;
101  }
102 
107  std::string getDatabaseName() override {
108  return dbName;
109  }
110 
115  void setSetName(std::string setName) {
116  this->setName = setName;
117  }
118 
123  std::string getSetName() override {
124  return setName;
125  }
126 
131  std::string getComputationType() override {
132  return std::string("WriteUserSet");
133  }
134 
140  return WriteUserSetTypeID;
141  }
142 
147  std::string getOutputType() override {
148  if (outputType == "") {
149  outputType = getTypeName<OutputClass>();
150  }
151  return outputType;
152  }
153 
158  int getNumInputs() override {
159  return 1;
160  }
161 
167  std::string getIthInputType(int i) override {
168  if (i == 0) {
169  return this->getOutputType();
170  } else {
171  return "";
172  }
173  }
174 
184  std::string toTCAPString(std::vector<InputTupleSetSpecifier>& inputTupleSets,
185  int computationLabel,
186  std::string& outputTupleSetName,
187  std::vector<std::string>& outputColumnNames,
188  std::string& addedOutputColumnName) override {
189 
190  if (inputTupleSets.empty()) {
191  return "";
192  }
193 
194  InputTupleSetSpecifier inputTupleSet = inputTupleSets[0];
195  return toTCAPString(inputTupleSet.getTupleSetName(),
196  inputTupleSet.getColumnNamesToKeep(),
197  inputTupleSet.getColumnNamesToApply(),
198  computationLabel,
200  outputColumnNames,
201  addedOutputColumnName);
202  }
203 
215  std::string toTCAPString(std::string inputTupleSetName,
216  std::vector<std::string>& inputColumnNames,
217  std::vector<std::string>& inputColumnsToApply,
218  int computationLabel,
219  std::string& outputTupleSetName,
220  std::vector<std::string>& outputColumnNames,
221  std::string& addedOutputColumnName) {
222 
223  //Names for output stuff
224  outputTupleSetName = inputTupleSetName + "_out";
225  outputColumnNames.emplace_back("");
226  addedOutputColumnName = "";
227 
228  // the template we are going to use to create the TCAP string for this ScanUserSet
229  mustache::mustache writeSetTemplate{"{{outputTupleSetName}}( {{outputColumnNames}}) <= "
230  "OUTPUT ( {{inputTupleSetName}} ( {{inputColumnsToApply}} ), "
231  "'{{setName}}', '{{dbName}}', '{{computationType}}_{{computationLabel}}')\n"};
232 
233 
234  // the data required to fill in the template
235  mustache::data writeSetData;
236  writeSetData.set("outputTupleSetName", outputTupleSetName);
237  writeSetData.set("outputColumnNames", outputColumnNames[0]);
238  writeSetData.set("inputTupleSetName", inputTupleSetName);
239  writeSetData.set("inputColumnsToApply", inputColumnsToApply[0]); //TODO? Only consider first column
240  writeSetData.set("computationType", getComputationType());
241  writeSetData.set("computationLabel", std::to_string(computationLabel));
242  writeSetData.set("setName", std::string(setName));
243  writeSetData.set("dbName", std::string(dbName));
244 
245 
246  // update the state of the computation
247  this->setTraversed(true);
248  this->setOutputTupleSetName(outputTupleSetName);
249  this->setOutputColumnToApply(addedOutputColumnName);
250 
251  // return the TCAP string
252  return writeSetTemplate.render(writeSetData);
253  }
254 
259  bool needsMaterializeOutput() override {
260  return true;
261  }
262 
263 protected:
264 
266 
268 
270 };
271 
272 }
273 
274 #endif //PDB_WRITEUSERSETBASE_H
ComputationTypeID
Definition: Computation.h:39
std::vector< std::string > & getColumnNamesToKeep()
bool needsMaterializeOutput() override
void setOutput(std::string dbName, std::string setName) override
std::string toTCAPString(std::string inputTupleSetName, std::vector< std::string > &inputColumnNames, std::vector< std::string > &inputColumnsToApply, int computationLabel, std::string &outputTupleSetName, std::vector< std::string > &outputColumnNames, std::string &addedOutputColumnName)
std::string getComputationType() override
std::string getSetName() override
void deleter(void *deleteMe, ObjType *dummy)
Definition: DeepCopy.h:48
WriteUserSetBase()=default
void setUpAndCopyFrom(void *target, void *source) const override
std::string toTCAPString(std::vector< InputTupleSetSpecifier > &inputTupleSets, int computationLabel, std::string &outputTupleSetName, std::vector< std::string > &outputColumnNames, std::string &addedOutputColumnName) override
ComputeSinkPtr getComputeSink(TupleSpec &consumeMe, TupleSpec &projection, ComputePlan &plan) override
void setSetName(std::string setName)
WriteUserSetBase(std::string dbName, std::string setName)
std::shared_ptr< ComputeSink > ComputeSinkPtr
Definition: ComputeSink.h:27
std::string getIthInputType(int i) override
void setOutputColumnToApply(std::string outputColumnToApply)
Definition: Computation.h:294
void deleteObject(void *deleteMe) override
size_t getSize(void *forMe) override
ComputationTypeID getComputationTypeID() override
std::string getDatabaseName() override
void setTraversed(bool traversed)
Definition: Computation.h:254
std::string getOutputType() override
std::vector< std::string > & getColumnNamesToApply()
void setOutputTupleSetName(std::string outputTupleSetName)
Definition: Computation.h:275
int getNumInputs() override
void setDatabaseName(std::string dbName)
String outputTupleSetName
Definition: Computation.h:379