ImagingTools Core SDK
CSqlDatabaseDocumentDelegateComp.h
1// SPDX-License-Identifier: LGPL-2.1-or-later OR GPL-2.0-or-later OR GPL-3.0-or-later OR LicenseRef-ImtCore-Commercial
2#pragma once
3
4
5// ACF includes
6#include <ifile/IFilePersistence.h>
7
8// ImtCore includes
9#include <imtbase/IComplexCollectionFilter.h>
10#include <imtbase/IRevisionController.h>
11#include <imtdb/CSqlDatabaseObjectDelegateCompBase.h>
12#include <imtdb/IJsonBasedMetaInfoDelegate.h>
13#include <imtdb/IDependentMetaInfoController.h>
14#include <imtdb/ISqlJsonXPathExtractor.h>
15#include <imtcol/CDocumentCollectionFilter.h>
16#include <imtcol/CDocumentIdFilter.h>
17
18
19namespace imtdb
20{
21
22
23struct RawSqlExpression
24{
25 QString sql;
26};
27
28
29class CSqlDatabaseDocumentDelegateComp:
30 public imtdb::CSqlDatabaseObjectDelegateCompBase,
31 virtual public imtbase::IRevisionController,
33{
34public:
35 typedef imtdb::CSqlDatabaseObjectDelegateCompBase BaseClass;
36
37 static const QByteArray s_idColumn;
38 static const QByteArray s_typeIdColumn;
39 static const QByteArray s_documentIdColumn;
40 static const QByteArray s_nameColumn;
41 static const QByteArray s_descriptionColumn;
42 static const QByteArray s_documentColumn;
43 static const QByteArray s_dataMetaInfoColumn;
44 static const QByteArray s_addedColumn;
45 static const QByteArray s_lastModifiedColumn;
46 static const QByteArray s_stateColumn;
47 static const QByteArray s_revisionInfoColumn;
48 static const QByteArray s_ownerIdKey;
49 static const QByteArray s_ownerNameKey;
50 static const QByteArray s_operationDescriptionKey;
51 static const QByteArray s_revisionNumberKey;
52 static const QByteArray s_checksumKey;
53 static QSet<QString> s_filterableColumns;
54
55 I_BEGIN_COMPONENT(CSqlDatabaseDocumentDelegateComp)
56 I_REGISTER_INTERFACE(imtbase::IRevisionController);
57 I_REGISTER_INTERFACE(imtdb::IDependentMetaInfoController);
58 I_ASSIGN(m_useDataMetaInfoAttrPtr, "UseDataMetaInfo", "If true - documents will be searched and sorted by the 'DataMetaInfo' column,\n else - otherwise according to the contents of the 'Document' column", true, false);
59 I_ASSIGN(m_autoCreateTableAttrPtr, "AutoCreateTable", "Auto create collection table if it does not exist", false, false);
60 I_ASSIGN(m_createTableScriptPathAttrPtr, "CreateTableScriptPath", "QRC path or file name of SQL script used to create collection table", false, ":/SQL/Postgres/CreateCollectionTable.sql");
61 I_ASSIGN_MULTI_0(m_documentFactoriesCompPtr, "DocumentFactories", "Factory list used for creation of the new document instance according to the given type-ID", true);
62 I_ASSIGN(m_metaInfoCreatorCompPtr, "MetaInfoCreator", "Creator of metainformation of object data", false, "MetaInfoCreator");
63 I_ASSIGN(m_jsonBasedMetaInfoDelegateCompPtr, "JsonBasedMetaInfoDelegate", "Delegate for converting document metainfo to JSON representation", false, "JsonBasedMetaInfoDelegate");
64 I_ASSIGN(m_sqlJsonXPathExtractorCompPtr, "SqlJsonXPathExtractor", "SQL json X-Path extractor", false, "SqlJsonXPathExtractor");
65 I_END_COMPONENT
66
67 // reimplemented (imtdb::ISqlDatabaseObjectDelegate)
68 virtual QByteArray GetCountQuery(const iprm::IParamsSet* paramsPtr = nullptr) const override;
69 virtual QByteArray GetObjectIdFromRecord(const QSqlRecord& record) const override;
70 virtual QByteArray GetSelectionQuery(
71 const QByteArray& objectId = QByteArray(),
72 int offset = 0,
73 int count = -1,
74 const iprm::IParamsSet* paramsPtr = nullptr) const override;
75 virtual istd::IChangeableUniquePtr CreateObjectFromRecord(
76 const QSqlRecord& record,
77 const iprm::IParamsSet* paramsPtr = nullptr) const override;
78 virtual NewObjectQuery CreateNewObjectQuery(
79 const QByteArray& typeId,
80 const QByteArray& proposedObjectId,
81 const QString& objectName,
82 const QString& objectDescription,
83 const istd::IChangeable* valuePtr,
84 const imtbase::IOperationContext* operationContextPtr) const override;
85 virtual QByteArray CreateDeleteObjectsQuery(
86 const imtbase::IObjectCollection& collection,
87 const imtbase::ICollectionInfo::Ids& objectIds,
88 const imtbase::IOperationContext* operationContextPtr) const override;
89 virtual QByteArray CreateDeleteObjectSetQuery(
90 const imtbase::IObjectCollection& collection,
91 const iprm::IParamsSet* paramsPtr = nullptr,
92 const imtbase::IOperationContext* operationContextPtr = nullptr) const override;
93 virtual QByteArray CreateRestoreObjectsQuery(
94 const imtbase::IObjectCollection& collection,
95 const imtbase::ICollectionInfo::Ids& objectIds,
96 const imtbase::IOperationContext* operationContextPtr = nullptr) const override;
97 virtual QByteArray CreateRestoreObjectSetQuery(
98 const imtbase::IObjectCollection& collection,
99 const iprm::IParamsSet* paramsPtr = nullptr,
100 const imtbase::IOperationContext* operationContextPtr = nullptr) const override;
101 virtual QByteArray CreateUpdateObjectQuery(
102 const imtbase::IObjectCollection& collection,
103 const QByteArray& objectId,
104 const istd::IChangeable& object,
105 const imtbase::IOperationContext* operationContextPtr,
106 bool useExternDelegate = true) const override;
107 virtual QByteArray CreateRenameObjectQuery(
108 const imtbase::IObjectCollection& collection,
109 const QByteArray& objectId,
110 const QString& newObjectName,
111 const imtbase::IOperationContext* operationContextPtr) const override;
112 virtual QByteArray CreateDescriptionObjectQuery(
113 const imtbase::IObjectCollection& collection,
114 const QByteArray& objectId,
115 const QString& description,
116 const imtbase::IOperationContext* operationContextPtr) const override;
117 virtual QByteArray GetSelectionByMetaInfoQuery(const QByteArray& metaInfoId, const QVariant& metaInfoValue) const override;
118 virtual QByteArray CreateUpdateMetaInfoQuery(const QSqlRecord& record) const override;
119
120 // reimplemented (imtbase::IRevisionController)
121 virtual RevisionInfoList GetRevisionInfoList(
122 const imtbase::IObjectCollection& collection,
123 const QByteArray& objectId) const override;
124 virtual int BackupRevision(
125 const imtbase::IObjectCollection& collection,
126 const imtbase::ICollectionInfo::Id& objectId,
127 const QString& userComment = QString()) const override;
128 virtual bool RestoreRevision(
129 imtbase::IObjectCollection& collection,
130 const imtbase::ICollectionInfo::Id& objectId,
131 int revision) const override;
132 virtual bool ExportRevision(
133 const imtbase::IObjectCollection& collection,
134 const imtbase::ICollectionInfo::Id& objectId,
135 int revision,
136 const QString& filePath) const override;
137 virtual bool DeleteRevision(
138 imtbase::IObjectCollection& collection,
139 const imtbase::ICollectionInfo::Id& objectId,
140 int revision) const override;
141
142 // reimplemented (imtdb::IDependentMetaInfoController)
143 virtual bool UpdateDependentMetaInfo(const DependentMetaInfo& metaInfo) const override;
144 virtual bool ClearDependentMetaInfo(const MetaFieldCleanupPlan& metaInfo) const override;
145
146 // reimplemented (icomp::CComponentBase)
147 virtual void OnComponentCreated() override;
148
149protected:
150 virtual bool CreateTableIfNeeded();
151 virtual QByteArray PrepareInsertNewObjectQuery(
152 const QByteArray& typeId,
153 const QByteArray& objectId,
154 const QString& objectName,
155 const QString& objectDescription,
156 const istd::IChangeable& object,
157 const imtbase::IOperationContext* operationContextPtr,
158 const QVariant& revisionArgument) const;
159 virtual istd::IChangeableUniquePtr CreateObject(const QByteArray& typeId) const;
160 virtual bool WriteDataToMemory(const QByteArray& typeId, const istd::IChangeable& object, QByteArray& data) const;
161 virtual bool ReadDataFromMemory(const QByteArray& typeId, const QByteArray& data, istd::IChangeable& object) const;
162 virtual QByteArray CreateRevisionInfoQuery(const imtbase::IOperationContext* operationContextPtr, const QVariant& revisionArgument, quint32 checksum) const;
163 virtual QByteArray CreateJsonBuildObjectQuery(const QVariantMap& paramMap) const;
164 virtual QString CreateJsonExtractSql(const QString& jsonName, const QString& key, QMetaType::Type metaType = QMetaType::QString, const QString& tableAlias = QString()) const;
165
166 // reimplemented (imtdb::CSqlDatabaseObjectDelegateCompBase)
167 virtual QString GetBaseSelectionQuery() const override;
168 virtual idoc::MetaInfoPtr CreateObjectMetaInfo(const QByteArray& typeId) const override;
169 virtual bool SetObjectMetaInfoFromRecord(const QSqlRecord& record, idoc::IDocumentMetaInfo& metaInfo) const override;
170 virtual bool CreateObjectFilterQuery(const iprm::IParamsSet& filterParams, QString& filterQuery) const override;
171 virtual bool CreateSortQuery(const imtbase::ICollectionFilter& collectionFilter, QString& sortQuery) const override;
172 virtual bool CreateSortQuery(const imtbase::IComplexCollectionFilter& collectionFilter, QString& sortQuery) const override;
173 virtual bool CreateFilterQuery(const iprm::IParamsSet& filterParams, QString& filterQuery) const override;
174 virtual bool CreateTextFilterQuery(const imtbase::ICollectionFilter& collectionFilter, QString& textFilterQuery) const override;
175 virtual bool CreateTimeFilterQuery(const imtbase::ITimeFilterParam& timeFilter, QString& timeFilterQuery, const QString& timeFieldId = QStringLiteral("root1.\"TimeStamp\"")) const override;
176
177protected:
178 virtual bool CreateObjectFilterQuery(const imtbase::IComplexCollectionFilter& collectionFilter, QString& filterQuery) const override;
179 virtual bool CreateTextFilterQuery(const imtbase::IComplexCollectionFilter& collectionFilter, QString& textFilterQuery) const override;
180 virtual void SubstituteFieldIds(QString& query, bool castToStr = true) const;
181 virtual QByteArray GetObjectSelectionQuery(const QByteArray& objectId, const iprm::IParamsSet* paramsPtr = nullptr) const;
182 virtual QByteArray CreateJoinTablesQuery() const;
183 virtual QByteArray GetCustomColumnsQuery() const;
184 virtual bool CreateDocumentCollectionFilterQuery(const imtcol::IDocumentCollectionFilter& documentCollectionFilter, QString& documentFilterQuery) const;
185 virtual bool CreateDocumentIdFilterQuery(const imtcol::IDocumentIdFilter& documentIdFilter, QString& documentIdFilterQuery) const;
186 bool IsArrayOperation(const QString& query, const QString& field) const;
187
188protected:
189 I_ATTR(bool, m_useDataMetaInfoAttrPtr);
190 I_ATTR(bool, m_autoCreateTableAttrPtr);
191 I_ATTR(QByteArray, m_createTableScriptPathAttrPtr);
192 I_MULTIFACT(istd::IChangeable, m_documentFactoriesCompPtr);
193 I_REF(imtbase::IMetaInfoCreator, m_metaInfoCreatorCompPtr);
194 I_REF(imtdb::IJsonBasedMetaInfoDelegate, m_jsonBasedMetaInfoDelegateCompPtr);
195 I_REF(imtdb::ISqlJsonXPathExtractor, m_sqlJsonXPathExtractorCompPtr);
196};
197
198
199} // namespace imtdb
200
201
202Q_DECLARE_METATYPE(imtdb::RawSqlExpression);
Manages cascading metadata updates when related objects are deleted.
Converts document metadata to/from JSON representation.
Database-specific JSON field extraction abstraction.
Database Abstraction Layer (ORM Framework) for ImtCore applications.