254 lines
6.7 KiB
C++
254 lines
6.7 KiB
C++
/*=============================================================================
|
|
# Filename: QueryTree.h
|
|
# Author: Jiaqi, Chen
|
|
# Mail: chenjiaqi93@163.com
|
|
# Last Modified: 2017-03-13
|
|
# Description:
|
|
=============================================================================*/
|
|
|
|
#ifndef _QUERY_QUERYTREE_H
|
|
#define _QUERY_QUERYTREE_H
|
|
|
|
#include "../Util/Util.h"
|
|
#include "Varset.h"
|
|
|
|
class QueryTree
|
|
{
|
|
public:
|
|
enum QueryForm {Select_Query, Ask_Query};
|
|
enum ProjectionModifier {Modifier_None, Modifier_Distinct, Modifier_Reduced, Modifier_Count, Modifier_Duplicates};
|
|
|
|
class GroupPattern
|
|
{
|
|
public:
|
|
class Pattern;
|
|
class FilterTree;
|
|
class Bind;
|
|
class SubGroupPattern;
|
|
|
|
std::vector<SubGroupPattern> sub_grouppattern;
|
|
|
|
Varset grouppattern_resultset_minimal_varset, grouppattern_resultset_maximal_varset;
|
|
Varset grouppattern_subject_object_maximal_varset, grouppattern_predicate_maximal_varset;
|
|
|
|
void addOnePattern(Pattern _pattern);
|
|
|
|
void addOneGroupUnion();
|
|
void addOneUnion();
|
|
GroupPattern& getLastUnion();
|
|
|
|
void addOneOptional(int _type);
|
|
GroupPattern& getLastOptional();
|
|
|
|
void addOneFilter();
|
|
FilterTree& getLastFilter();
|
|
|
|
void addOneBind();
|
|
Bind& getLastBind();
|
|
|
|
void getVarset();
|
|
|
|
std::pair<Varset, Varset> checkNoMinusAndOptionalVarAndSafeFilter(Varset occur_varset, Varset ban_varset, bool &check_condition);
|
|
|
|
void initPatternBlockid();
|
|
int getRootPatternBlockID(int x);
|
|
void mergePatternBlockID(int x, int y);
|
|
|
|
void print(int dep);
|
|
};
|
|
|
|
class GroupPattern::Pattern
|
|
{
|
|
public:
|
|
class Element
|
|
{
|
|
public:
|
|
//enum Type { Variable, Literal, IRI };
|
|
//enum SubType { None, CustomLanguage, CustomType };
|
|
//Type type;
|
|
//SubType subType;
|
|
//std::string subTypeValue;
|
|
|
|
std::string value;
|
|
Element(){}
|
|
Element(const std::string &_value):value(_value){}
|
|
};
|
|
Element subject, predicate, object;
|
|
Varset varset, subject_object_varset;
|
|
int blockid;
|
|
|
|
Pattern():blockid(-1){}
|
|
Pattern(const Element _subject, const Element _predicate, const Element _object):
|
|
subject(_subject), predicate(_predicate), object(_object), blockid(-1){}
|
|
};
|
|
|
|
class GroupPattern::FilterTree
|
|
{
|
|
public:
|
|
class FilterTreeNode
|
|
{
|
|
public:
|
|
enum FilterOperationType
|
|
{
|
|
None_type, Or_type, And_type, Equal_type, NotEqual_type, Less_type, LessOrEqual_type, Greater_type, GreaterOrEqual_type,
|
|
Plus_type, Minus_type, Mul_type, Div_type, Not_type, UnaryPlus_type, UnaryMinus_type, Literal_type, Variable_type, IRI_type,
|
|
Function_type, ArgumentList_type, Builtin_str_type, Builtin_lang_type, Builtin_langmatches_type, Builtin_datatype_type, Builtin_bound_type,
|
|
Builtin_sameterm_type, Builtin_isiri_type, Builtin_isuri_type, Builtin_isblank_type, Builtin_isliteral_type, Builtin_isnumeric_type,
|
|
Builtin_regex_type, Builtin_in_type, Builtin_exists_type
|
|
};
|
|
FilterOperationType oper_type;
|
|
|
|
class FilterTreeChild;
|
|
|
|
std::vector<FilterTreeChild> child;
|
|
|
|
FilterTreeNode():oper_type(None_type){}
|
|
|
|
void getVarset(Varset &varset);
|
|
void mapVarPos2Varset(Varset &varset, Varset &entity_literal_varset);
|
|
|
|
void print(int dep);
|
|
};
|
|
|
|
FilterTreeNode root;
|
|
Varset varset;
|
|
bool done;
|
|
FilterTree():done(false){}
|
|
};
|
|
|
|
class GroupPattern::FilterTree::FilterTreeNode::FilterTreeChild
|
|
{
|
|
public:
|
|
enum FilterTreeChildNodeType {None_type, Tree_type, String_type};
|
|
FilterTreeChildNodeType node_type;
|
|
|
|
FilterTreeNode node;
|
|
std::string str;
|
|
int pos;
|
|
bool isel;
|
|
|
|
FilterTreeChild():node_type(None_type), pos(-1), isel(true){}
|
|
};
|
|
|
|
class GroupPattern::Bind
|
|
{
|
|
public:
|
|
Bind(){}
|
|
Bind(const std::string &_str, const std::string &_var):str(_str), var(_var){}
|
|
std::string str, var;
|
|
Varset varset;
|
|
};
|
|
|
|
class GroupPattern::SubGroupPattern
|
|
{
|
|
public:
|
|
enum SubGroupPatternType{Pattern_type, Union_type, Optional_type, Minus_type, Filter_type, Bind_type};
|
|
SubGroupPatternType type;
|
|
|
|
Pattern pattern;
|
|
std::vector<GroupPattern> unions;
|
|
GroupPattern optional;
|
|
FilterTree filter;
|
|
Bind bind;
|
|
|
|
SubGroupPattern(SubGroupPatternType _type):type(_type){}
|
|
SubGroupPattern(const SubGroupPattern& _sgp):type(_sgp.type)
|
|
{
|
|
pattern = _sgp.pattern;
|
|
unions = _sgp.unions;
|
|
optional = _sgp.optional;
|
|
filter = _sgp.filter;
|
|
bind = _sgp.bind;
|
|
}
|
|
};
|
|
|
|
class ProjectionVar
|
|
{
|
|
public:
|
|
enum AggregateType{None_type, Count_type, Sum_type, Min_type, Max_type, Avg_type};
|
|
AggregateType aggregate_type;
|
|
|
|
std::string var, aggregate_var;
|
|
bool distinct;
|
|
|
|
ProjectionVar():aggregate_type(None_type), distinct(false){}
|
|
};
|
|
|
|
class Order
|
|
{
|
|
public:
|
|
std::string var;
|
|
bool descending;
|
|
Order(std::string &_var, bool _descending):var(_var), descending(_descending){}
|
|
};
|
|
|
|
enum UpdateType {Not_Update, Insert_Data, Delete_Data, Delete_Where, Insert_Clause, Delete_Clause, Modify_Clause};
|
|
|
|
private:
|
|
QueryForm query_form;
|
|
|
|
ProjectionModifier projection_modifier;
|
|
std::vector<ProjectionVar> projection;
|
|
bool projection_asterisk;
|
|
|
|
Varset group_by;
|
|
std::vector<Order> order_by;
|
|
int offset, limit;
|
|
|
|
GroupPattern grouppattern;
|
|
|
|
//----------------------------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
UpdateType update_type;
|
|
|
|
//only use patterns
|
|
GroupPattern insert_patterns, delete_patterns;
|
|
|
|
public:
|
|
QueryTree():
|
|
query_form(Select_Query), projection_modifier(Modifier_None), projection_asterisk(false), offset(0), limit(-1), update_type(Not_Update){}
|
|
|
|
void setQueryForm(QueryForm _queryform);
|
|
QueryForm getQueryForm();
|
|
|
|
void setProjectionModifier(ProjectionModifier _projection_modifier);
|
|
ProjectionModifier getProjectionModifier();
|
|
|
|
void addProjectionVar();
|
|
ProjectionVar& getLastProjectionVar();
|
|
std::vector<ProjectionVar>& getProjection();
|
|
Varset getProjectionVarset();
|
|
Varset getResultProjectionVarset();
|
|
|
|
void setProjectionAsterisk();
|
|
bool checkProjectionAsterisk();
|
|
|
|
void addGroupByVar(std::string &_var);
|
|
Varset& getGroupByVarset();
|
|
|
|
void addOrderVar(std::string &_var, bool _descending);
|
|
std::vector<Order>& getOrderVarVector();
|
|
Varset getOrderByVarset();
|
|
|
|
void setOffset(int _offset);
|
|
int getOffset();
|
|
void setLimit(int _limit);
|
|
int getLimit();
|
|
|
|
GroupPattern& getGroupPattern();
|
|
|
|
void setUpdateType(UpdateType _updatetype);
|
|
UpdateType getUpdateType();
|
|
GroupPattern& getInsertPatterns();
|
|
GroupPattern& getDeletePatterns();
|
|
|
|
bool checkWellDesigned();
|
|
bool checkAtLeastOneAggregateFunction();
|
|
bool checkSelectAggregateFunctionGroupByValid();
|
|
|
|
void print();
|
|
};
|
|
|
|
#endif // _QUERY_QUERYTREE_H
|
|
|