00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef OST_QUERY_IMPL_HH
00020 #define OST_QUERY_IMPL_HH
00021
00022 #include <vector>
00023 #include <string>
00024 #include <set>
00025
00026 #include <boost/logic/tribool.hpp>
00027
00028 #include <ost/mol/module_config.hh>
00029 #include "query_impl_fw.hh"
00030 #include "query_ast.hh"
00031 #include <ost/range.hh>
00032 #include <ost/mol/query_error.hh>
00033 #include "atom_impl_fw.hh"
00034 #include "residue_impl_fw.hh"
00035 #include "chain_impl_fw.hh"
00036 #include <ost/mol/mol.hh>
00037 #include <ost/mol/query_state.hh>
00038 #include <ost/mol/entity_property_mapper.hh>
00039
00040 namespace ost { namespace mol { namespace impl {
00041
00042 namespace tok {
00044 typedef enum {
00045 IntegralValue,
00046 FloatingValue,
00047 Colon,
00048 Coma,
00049 Dot,
00050 And,
00051 Or,
00052 Not,
00053 Equal,
00054 NotEqual,
00055 GreaterEqualThan,
00056 GreaterThan,
00057 LessThan,
00058 LessEqualThan,
00059 Identifier,
00060 Within,
00061 LeftCurlyBrace,
00062 RightCurlyBrace,
00063 LeftParen,
00064 RightParen,
00065 LeftBracket,
00066 RightBracket,
00067 None,
00068 UnknownChar,
00069 UnterminatedQuote,
00070 String
00071 }
00072 Type;
00073 }
00074
00076 class QueryToken {
00077 public:
00078 QueryToken();
00079 QueryToken(const Range& range, tok::Type type,
00080 const Range& value_range=Range());
00081
00082 tok::Type GetType() const;
00084 bool IsEOF() const;
00086 const Range& GetRange() const;
00089 const Range& GetValueRange() const;
00090 private:
00091 tok::Type type_;
00092 Range range_;
00093 Range value_range_;
00094 };
00095
00097 class QueryLexer {
00098 public:
00099 QueryLexer(const String& query_string);
00100 QueryToken NextToken();
00101 QueryToken CurrentToken() const;
00102 private:
00104
00105 void EatWhitespaces();
00107 QueryToken LexToken();
00108 QueryToken LexQuotedStringLiteral();
00109 QueryToken LexNumericToken();
00110 QueryToken LexIdentOrStringToken();
00111
00112 String query_string_;
00113 size_t current_;
00114 QueryToken tok_;
00115 };
00116
00118 struct SelStmt {
00119 Prop::ID sel_id;
00120 CompOP comp_op;
00121 ParamType param;
00122 SelStmt()
00123 : sel_id(Prop::UNDEF),
00124 comp_op(COP_EQ),
00125 param(0) { }
00126 SelStmt(Prop::ID id ,CompOP op, const ParamType& parm)
00127 : sel_id(id),
00128 comp_op(op),
00129 param(parm) { }
00130
00131 bool operator ==(const SelStmt& rhs) {
00132 return sel_id == rhs.sel_id && comp_op == rhs.comp_op && param == rhs.param;
00133 }
00134 };
00135 typedef enum {
00136 LOGIC, VALUE
00137 } SelItemType;
00138
00140 struct SelItem {
00141 SelItemType type;
00142 size_t value;
00143 };
00144
00148 struct GenProp {
00149 EntityPropertyMapper mapper;
00150 float default_val;
00151 bool has_default;
00152 GenProp(EntityPropertyMapper epm) :
00153 mapper(epm), default_val(0.0), has_default(false) {}
00154 };
00155
00157 typedef std::vector<SelItem> SelStack;
00158
00160 typedef std::vector<SelStmt> SelStmts;
00161
00164 class QueryImpl {
00165 public:
00166 friend class mol::QueryState;
00168 QueryImpl(const String& query_string="");
00171 QueryImpl(Node* ast);
00173 bool IsValid() const;
00174
00176 bool IsEmpty() const;
00177
00179 const String& GetQueryString() const;
00180
00181
00182 const QueryErrorDesc& GetErrorDescription() const;
00183
00184 mol::QueryState CreateQueryState(const EntityHandle& h) const;
00185 mol::QueryState CreateQueryState(const EntityView& v) const;
00186 private:
00187
00189 Node* BuildAST();
00191 void ASTToSelStack(const Node* src_ast,Prop::Level target_level,
00192 SelStack& stack);
00193
00196 bool IsAlwaysUndef(const Node* ast_node, Prop::Level target_level);
00197
00199 void ExtractSelStmts(const Node* ast);
00200
00202 Node* ParsePropValueExpr(QueryLexer& lexer);
00203
00206 Node* ParseSubExpr(QueryLexer& lexer, bool paren=false);
00207
00210 Node* ParseParenSubExpr(QueryLexer& lexer);
00211
00215 Node* ParseBracketSubExpr(QueryLexer& lexer);
00216
00219 Node* ParseWithinExpr(QueryLexer& lexer);
00220
00229 bool ParsePoint(QueryLexer& lexer, geom::Vec3& point);
00230
00233 bool Expect(tok::Type type, const String& s, const QueryToken& token);
00234
00237 bool ExpectNumeric(const QueryToken& token);
00238
00241 bool ExpectLogicalOperator(const QueryToken& token);
00242
00245 bool ExpectComparisonOperator(const QueryToken& token);
00246
00253 bool ExpectNotEnd(const QueryToken& token, const String& s);
00254
00257 bool ParseValue(const Prop& sel, const QueryToken& op,
00258 QueryLexer& lexer, ParamType& value);
00259
00262 Node* ParseValueOrRange(const Prop& s, const QueryToken& op,
00263 QueryLexer& lexer);
00265 Node* Concatenate(Node* lhs, Node* rhs, LogicOP logical_op);
00266
00267 String query_string_;
00268 bool has_error_;
00269 bool empty_optimize_;
00270 QueryErrorDesc error_desc_;
00271 std::vector<GenProp> gen_prop_list_;
00272 int num_gen_prop_;
00273 protected:
00274 std::vector<SelStmt> sel_values_;
00275 std::vector<SelStack> sel_stacks_;
00276 std::vector<std::set<size_t> > indices_;
00277 std::vector<bool> inversion_stack_;
00278 std::vector<QueryImplP> bracketed_expr_;
00279 };
00280
00281 }}}
00282
00283 #endif