metadataengine/server/inc/mdsfindsqlclause.h
changeset 0 c53acadfccc6
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/metadataengine/server/inc/mdsfindsqlclause.h	Mon Jan 18 20:34:07 2010 +0200
@@ -0,0 +1,476 @@
+/*
+* Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  Constructs SQL clauses for object find*
+*/
+
+#ifndef __MDSFINDSQLCLAUSE_H__
+#define __MDSFINDSQLCLAUSE_H__
+
+#include <e32base.h>
+#include <badesca.h>
+
+#include "mdccommon.h"
+#include "mdssqliteconnection.h"
+
+// FORWARD DECLARATIONS
+class CMdCSerializationBuffer;
+class CMdsSchema;
+class CMdsNamespaceDef;
+class CMdsObjectDef;
+class CMdsClauseBuffer;
+class CMdsPropertyDef;
+class TMdCSearchCriteria;
+class TMdCRelationCondition;
+
+// CLASS DECLARATION
+/**
+* CMdSFindSqlClause.
+* Class constructs SQL search clauses.
+*/
+class CMdSFindSqlClause : public CBase
+    //public MMdSFindCriteria
+    {
+    private:
+		enum TAppendIn
+		{
+			EAppendInFalse,
+			EAppendInTrue,
+			EAppendInRelationLeft,
+			EAppendInRelationRight
+		};
+
+		enum TRangeValueType
+		{
+			EInt32RangeValue,
+			EUint32RangeValue,
+			EInt64RangeValue
+		};
+		
+    public: // Constructors and destructor
+
+        /**
+        * NewL.
+        * Two-phased constructor.
+        * @param aSchema reference to metadata server's internal schema.
+        * @return Pointer to created CMdSFindEngine object.
+        */
+        static CMdSFindSqlClause* NewL(CMdsSchema& aSchema);
+
+        /**
+        * NewLC.
+        * Two-phased constructor.
+        * @param aSchema reference to metadata server's internal schema.
+        * @return Pointer to created CMdSManipulationEngine object.
+        */
+        static CMdSFindSqlClause* NewLC(CMdsSchema& aSchema);
+
+        /**
+        * Destructor.
+        */
+        virtual ~CMdSFindSqlClause();
+
+    private: // Private constructors
+
+        /**
+        * CMdSSqlClause.
+        * C++ default constructor.
+        * @param aSchema reference to metadata server's internal schema.
+        */
+        CMdSFindSqlClause(CMdsSchema& aSchema);
+
+        /**
+        * ConstructL.
+        * 2nd phase constructor.
+        */
+        void ConstructL();
+
+    public: // Public functions
+
+	    /**
+	    * Constructs criteria the LONG way. ALL criteria and rule params
+	    * are taken in account.
+	    * @param aSerializedCriteria search criteria in serialized form.
+	    * @param aUserLevel
+	    */
+        void CreateL( 
+        	CMdCSerializationBuffer& aSerializedCriteria,
+        	TUserLevel aUserLevel );
+
+        /**
+	    * Returns the decoded value as some kind of textual description
+	    * @return search clause as TDesC8 descriptor
+	    */
+        const TDesC& AsTextL() const;
+
+        /**
+        * Returns constructed variable stack.
+	    * @return clause variables.
+        */
+        RRowData& Variables();
+
+        /**
+        * Returns constructed result row stack.
+	    * @return clause variables.
+        */
+        RRowData& ResultRow();
+
+        /**
+        * Returns limit count.
+	    * @return limit.
+        */
+		TUint32 Limit();
+
+		/**
+		* Does SQL clause include freetext count and total length
+		* @return SQL clause includes freetext count and total length
+		*/
+		TBool IncludesFreetexts();
+
+        /**
+        * Returns object query's object definition.
+        * @return Object definition if query is object query else NULL.
+        */
+        CMdsObjectDef* ObjectDef();
+
+        /**
+        * Returns object query's property denitions used in property filter.
+        * @return Object definition if query is object query else NULL.
+        */
+        RPointerArray<CMdsPropertyDef>& PropertyFilters();
+
+        /**
+        * Returns query's namespace definition.
+        * @return Namespace definition if NULL query buffer is corrupted.
+        */
+        CMdsNamespaceDef* NamespaceDef();
+
+        /**
+        * Returns query type.
+        * @return Query type
+        */
+        TQueryType QueryType();
+
+        /**
+        * Returns query result mode.
+        * @return Query result mode
+        */
+        TQueryResultMode ResultMode();
+
+        /**
+         * Returns query freetext array
+         * @return freetext array
+         */
+        RPointerArray<HBufC>& QueryFreeText();
+
+        /**
+         * Result objects are not locked
+         * @return object locking status
+         */
+        TBool NoObjectLocking();
+        
+    private: // Private functions
+
+        /**
+        * appends an array of OR'ed aColumn=ID conditions.
+        * @param aColumn A column of variable set where id is appended
+        * @param aSet container of item ids
+        */
+        void AppendArrayL( /*const TDesC& aColumn, const RArray<TItemId>& aSet*/ );
+
+		void AppendPropertyFiltersL( TBool aDistinct = EFalse );
+
+        /**
+        * Creates "SELECT column list FROM table name" SQL clause query
+        * based on iType.
+        */
+        void AppendSelectStatementL();
+
+        /**
+        * Creates "SELECT count(*) FROM table name" SQL clause query
+        * based on iType.
+        */
+        void AppendSelectCountStatementL();
+        
+        /**
+        * Creates "SELECT * FROM table name" SQL clause query
+        * based on iType.
+        */
+        void AppendSelectAllFromEventStatementL();
+        
+        void AppendSelectAllFromRelationStatementL();
+        
+        void AppendSelectEventItemStatementL();
+        
+        void AppendSelectRealtionItemStatementL();
+        
+        /**
+        * Creates "SELECT DISTINCT "wanted property's column" FROM table name" 
+        * SQL clause query based on iType.
+        */
+        void AppendSelectDistinctStatementL();
+
+		void AppendSelectObjectItemStatementL();
+
+		void AppendSelectObjectIdStatementL();
+		
+		void AppendFromForObjectL();
+
+	    void AppendFromForEventL();
+		
+		void AppendFromForRelationL();
+		
+		/**
+		* Creates "WHERE(...)"
+		*/
+		void AppendWhereStatementL();
+
+        /**
+        * Helper which creates "SELECT statement for object query.
+        */
+        void AppendSelectForObjectL();
+
+        /**
+        * Helper which creates "SELECT statement for relation query.
+        * @param aRules find rules
+        */
+        void AppendSelectForRelationL( /*const TMdCFolder& aRules*/ );
+
+        /**
+        * Helper which creates "SELECT statement for event query.
+        * @param aRules find rules
+        */
+        void AppendSelectForEventL( /*const TMdCFolder& aRules*/ );
+
+        /**
+        * Help method for where clause parsing and is used recursively.
+        */
+        void WhereStatementL();
+
+		void ConditionStatementL(TBool aNegated = EFalse, TAppendIn aAppendIdIn = EAppendInTrue);
+
+		void AppendObjectIdL();
+		
+		void AppendIdInL();
+
+        /**
+        * Help method for appending logic condition.
+        * @param aNegated is condition negated
+        */
+		void AppendLogicConditionL(TBool aNegated, TAppendIn aAppendIdIn = EAppendInTrue);
+
+        /**
+        * Help method for appending object condition.
+        * @param aNegated is condition negated
+        */
+		void AppendObjectConditionL(TBool aNegated);
+
+		/**
+		 * Help method for appending range.
+		 * @param aRangeValueType type of range's values
+		 */
+		void AppendRangeL(TRangeValueType aRangeValueType);
+
+        /**
+        * Help method for appending property condition.
+        *
+        * @param aNegated is condition negated
+        */
+		void AppendPropertyConditionL(TBool aNegated);
+
+		/** 
+		 * Helper method for getting object definition for property condition.
+		 * 
+		 * @param aObjectDefId property condition's object definition
+		 * 
+		 * @return object definition for query
+		 */
+		TDefId ObjectDefForPropertyCondition(TDefId aObjectDefId);
+		
+        /**
+        * Help method for appending property range condition.
+        *
+        * @param aNegated is condition negated
+        */
+		void AppendPropertyRangeConditionL(TBool aNegated);
+
+        /**
+        * Help method for appending property text condition.
+        * @param aNegated is condition negated
+        */
+		void AppendPropertyTextConditionL(TBool aNegated);
+
+        /**
+        * Help method for appending property bool condition.
+        * @param aNegated is condition negated
+        */
+		void AppendPropertyBoolConditionL(TBool aNegated);
+
+        /**
+        * Help method for appending event condition for object query.
+        * @param aNegated is condition negated
+        */
+		void AppendEventConditionL(TBool aNegated);
+
+        /**
+        * Help method for appending relation condition for object query.
+        * @param aNegated is condition negated
+        */
+		void AppendRelationConditionL(TBool aNegated);
+
+		void AppendRelationSideConditionL(TBool aRelationConditions, 
+				const TMdCRelationCondition& aRelationCondition, 
+				TBool aLeftSide, TUint32 aRelationObjectConditionOffset);
+
+        /**
+        * Help method for searching object definition's table,
+        * based on object definition's ID, and appending those to buffer.
+        * @param aObjectDefId object definition's ID
+        */
+		void AppendTableByObjectDefIdL(TDefId aObjectDefId);
+
+        /**
+        * Help method for searching property definition's column,
+        * based on property definition's ID, and appending those to buffer.
+        * @param aPropertyDefId property definition's ID
+        * @param aObjectDefId object definition's ID
+        * @param aResult append property to expected result row
+        */
+		void AppendColumnByPropertyDefIdL(TDefId aPropertyDefId, TDefId aObjectDefId = KNoDefId, TBool aResult = EFalse);
+
+        /**
+        * Help method which appends GROUP BY statements.
+        */
+        void AppendGroupByL();
+
+        /**
+        * Help method which appends ORDER BY statements.
+        */
+        void AppendOrderByL();
+
+        /**
+        * Help method which appends LIMIT and OFFSET.
+        */
+        void AppendLimitAndOffsetL();
+
+        /** 
+        * Help method that copies the rightmost part of the variables to
+        * RowData. The function does not cut or remove any data but doubles
+        * a number of variables.
+        * @param aStart index of the first variable to be copied.
+        * @param aEnd index of the last variable to be copied.
+        */
+        void CopyVariablesL( TInt aStart, TInt aEnd );
+
+    private: // Member data
+
+        /**
+        * variables used in the clause.
+        * Note: RRowData constructor cannot leave, since it is initialized (aInStack==EFalse)
+        */
+        RRowData iVariables;
+
+        /**
+        * Expected result row from the clause.
+        * Note: RRowData constructor cannot leave, since it is initialized (aInStack==EFalse)
+        */
+        RRowData iResultRow;
+
+        /**
+        * Text buffer for whole query clause. CMdsClauseBuffer class takes care
+        * of memory allocation for buffer.
+        */
+        CMdsClauseBuffer* iQueryBuf;
+
+		/**
+		* Metadata Server's internal schema
+		*/
+		CMdsSchema& iSchema;
+
+		/**
+		* Serialized query critertia 
+		*/
+		TMdCSearchCriteria* iSearchCriteria;
+
+		/**
+		* Serialized query critertia 
+		*/
+		CMdCSerializationBuffer* iSerializedBuffer;       
+
+		/**
+		* Client application's user level
+		*/
+		TUserLevel iUserLevel;
+
+		/**
+		* Namespace definition where to search
+		*/
+		CMdsNamespaceDef* iNamespaceDef;
+
+        /**
+        * Object definition for where to (WHERE expression) search in object 
+        * queries
+        */
+        CMdsObjectDef* iObjectDef;
+
+        /**
+         * Object definition for what to (SELECT result and FROM table list) 
+         * search in object queries
+         */
+        CMdsObjectDef* iSourceObjectDef;
+
+        /**
+         * Object definitions IDs for what to (SELECT result and FROM table list) 
+         * search in object queries
+         */
+        RArray<TDefId>* iSourceObjectDefs;
+        
+        /**
+         * Append columns to result row (ETrue only for first ID from iSourceObjectDefs).
+         */
+        TBool iAppendToResultRow;
+        
+        /**
+        * Descriptor which contains namespace definition's ID in text format
+        */
+        TBuf16<16> iNamespaceIdDes;                
+        
+        /**
+        * Filter property definition references
+        */
+        RPointerArray<CMdsPropertyDef> iPropertyFilters;
+
+		/**
+		* Include freetexts to result.
+		*/
+		TBool iIncludeFreetexts;
+		
+		/**
+		* Include not present items to result.
+		*/
+		TBool iIncludeNotPresent;
+
+		/**
+		 * Free text which belong to query.
+		 */
+		RPointerArray<HBufC> iFreeText;
+		
+		/**
+		 * Result objects are not locked.
+		 */
+		TBool iNoObjectLocking;
+		
+		TBool iPlaceholdersOnly;
+        };
+
+#endif //__MDSFINDSQLCLAUSE_H__