#ifndef _QmfEngineQueryImpl_ #define _QmfEngineQueryImpl_ /* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ #include "qmf/engine/Query.h" #include "qmf/engine/Schema.h" #include #include namespace qpid { namespace framing { class Buffer; } } namespace qmf { namespace engine { struct QueryElementImpl { QueryElementImpl(const std::string& a, const Value* v, ValueOper o) : attrName(a), value(v), oper(o) {} ~QueryElementImpl() {} bool evaluate(const Object* object) const; std::string attrName; const Value* value; ValueOper oper; }; struct QueryExpressionImpl { QueryExpressionImpl(ExprOper o, const QueryOperand* operand1, const QueryOperand* operand2) : oper(o), left(operand1), right(operand2) {} ~QueryExpressionImpl() {} bool evaluate(const Object* object) const; ExprOper oper; const QueryOperand* left; const QueryOperand* right; }; struct QueryImpl { // Constructors mapped to public QueryImpl(const std::string& c, const std::string& p) : packageName(p), className(c), select(0), resultLimit(0) {} QueryImpl(const SchemaClassKey* key) : packageName(key->getPackageName()), className(key->getClassName()), select(0), resultLimit(0) {} QueryImpl(const ObjectId* oid) : oid(new ObjectId(*oid)), select(0), resultLimit(0) {} // Factory constructors QueryImpl(qpid::framing::Buffer& buffer); ~QueryImpl() {}; static Query* factory(qpid::framing::Buffer& buffer); void setSelect(const QueryOperand* criterion) { select = criterion; } void setLimit(uint32_t maxResults) { resultLimit = maxResults; } void setOrderBy(const std::string& attrName, bool decreasing) { orderBy = attrName; orderDecreasing = decreasing; } const std::string& getPackage() const { return packageName; } const std::string& getClass() const { return className; } const ObjectId* getObjectId() const { return oid.get(); } bool haveSelect() const { return select != 0; } bool haveLimit() const { return resultLimit > 0; } bool haveOrderBy() const { return !orderBy.empty(); } const QueryOperand* getSelect() const { return select; } uint32_t getLimit() const { return resultLimit; } const std::string& getOrderBy() const { return orderBy; } bool getDecreasing() const { return orderDecreasing; } void encode(qpid::framing::Buffer& buffer) const; bool singleAgent() const { return oid.get() != 0; } uint32_t agentBank() const { return singleAgent() ? oid->getAgentBank() : 0; } std::string packageName; std::string className; boost::shared_ptr oid; const QueryOperand* select; uint32_t resultLimit; std::string orderBy; bool orderDecreasing; }; } } #endif