Skip to content

Commit

Permalink
Reduce operator boilerplate
Browse files Browse the repository at this point in the history
Add notion of  constructable operators.

Implement vname directly on _PlanOperation, freeing operations from having to declare it.
  • Loading branch information
bastih committed Mar 13, 2013
1 parent c32cc90 commit 6576e8d
Show file tree
Hide file tree
Showing 3 changed files with 27 additions and 3 deletions.
4 changes: 4 additions & 0 deletions src/lib/access/PlanOperation.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -287,3 +287,7 @@ const std::string& _PlanOperation::planOperationName() const {
void _PlanOperation::setPlanOperationName(const std::string& name) {
_planOperationName = name;
}

const std::string _PlanOperation::vname() {
return planOperationName();
}
1 change: 1 addition & 0 deletions src/lib/access/PlanOperation.h
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,7 @@ class _PlanOperation : public OutputTask {
void setPlanOperationName(const std::string& name);

virtual void operator()() noexcept;
virtual const std::string vname();
const _PlanOperation *execute();
};

Expand Down
25 changes: 22 additions & 3 deletions src/lib/access/QueryParser.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,14 +28,27 @@ struct AbstractQueryParserFactory {
virtual ~AbstractQueryParserFactory() {}
};

struct parse_construct {};
struct default_construct {};

template <typename T, typename parse_construction>
struct QueryParserFactory;

template<typename T>
struct QueryParserFactory : public AbstractQueryParserFactory {
struct QueryParserFactory<T, parse_construct> : public AbstractQueryParserFactory {

virtual std::shared_ptr<_PlanOperation> parse(Json::Value data) {
return T::parse(data);
}
};

template<typename T>
struct QueryParserFactory<T, default_construct> : public AbstractQueryParserFactory {
virtual std::shared_ptr<_PlanOperation> parse(Json::Value data) {
return std::make_shared<T>();
}
};

/*
* The Query Parser parses a given Json Value to create a plan operation
*
Expand Down Expand Up @@ -76,16 +89,22 @@ class QueryParser {

template<typename T>
static bool registerPlanOperation() {
QueryParser::instance()._factory[T::name()] = new QueryParserFactory<T>();
QueryParser::instance()._factory[T::name()] = new QueryParserFactory<T, parse_construct>();
return true;
}

template<typename T>
static bool registerPlanOperation(const std::string& name) {
QueryParser::instance()._factory[name] = new QueryParserFactory<T>();
QueryParser::instance()._factory[name] = new QueryParserFactory<T, parse_construct>();
return true;
}

template<typename T>
static bool registerTrivialPlanOperation(const std::string& name) {
QueryParser::instance()._factory[name] = new QueryParserFactory<T, default_construct>();
return true;
}

std::shared_ptr<_PlanOperation> parse(std::string name, Json::Value d);

static QueryParser &instance();
Expand Down

0 comments on commit 6576e8d

Please sign in to comment.