fvresultset.ipp 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508
  1. /*##############################################################################
  2. HPCC SYSTEMS software Copyright (C) 2012 HPCC Systems®.
  3. Licensed under the Apache License, Version 2.0 (the "License");
  4. you may not use this file except in compliance with the License.
  5. You may obtain a copy of the License at
  6. http://www.apache.org/licenses/LICENSE-2.0
  7. Unless required by applicable law or agreed to in writing, software
  8. distributed under the License is distributed on an "AS IS" BASIS,
  9. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  10. See the License for the specific language governing permissions and
  11. limitations under the License.
  12. ############################################################################## */
  13. #ifndef FVRESULTSET_IPP
  14. #define FVRESULTSET_IPP
  15. #include "fileview.hpp"
  16. #include "fvdatasource.hpp"
  17. #include "fvtransform.ipp"
  18. //---------------------------------------------------------------------------
  19. //Internal interface used to help implement the related dataset browsing
  20. interface IExtendedResultSetCursor : extends IResultSetCursor
  21. {
  22. public:
  23. virtual void noteRelatedFileChanged() = 0;
  24. };
  25. //---------------------------------------------------------------------------
  26. struct MemoryAttrItem : public CInterface, public MemoryAttr
  27. {
  28. MemoryAttrItem() : MemoryAttr() {}
  29. MemoryAttrItem(unsigned len, const void * ptr) : MemoryAttr(len, ptr) {}
  30. };
  31. typedef CIArrayOf<MemoryAttrItem> MemoryAttrArray;
  32. class CStrColumnFilter : public CInterface
  33. {
  34. public:
  35. void addValue(unsigned len, const char * value) { values.append(* new MemoryAttrItem(len, value)); }
  36. void clear() { values.kill(); }
  37. public:
  38. MemoryAttrArray values;
  39. };
  40. typedef CIArrayOf<CStrColumnFilter> StrColumnFilterArray;
  41. //---------------------------------------------------------------------------
  42. class CResultSet;
  43. class CResultSetCursor;
  44. class ViewJoinColumn;
  45. class CResultSetColumnInfo : public CInterface
  46. {
  47. public:
  48. ITypeInfo * type;
  49. Owned<IResultSetMetaData> childMeta;
  50. ViewFieldTransformerArray getTransforms;
  51. ViewFieldTransformerArray setTransforms;
  52. StringAttr naturalName;
  53. byte flag;
  54. };
  55. class CResultSetMetaData : implements IResultSetMetaData, public CInterface
  56. {
  57. friend class CResultSet;
  58. friend class CResultSetCursor;
  59. public:
  60. CResultSetMetaData(IFvDataSourceMetaData * _meta, bool _useXPath);
  61. CResultSetMetaData(const CResultSetMetaData & _meta);
  62. IMPLEMENT_IINTERFACE
  63. virtual IResultSetMetaData * getChildMeta(int column) const;
  64. virtual int getColumnCount() const;
  65. virtual DisplayType getColumnDisplayType(int column) const;
  66. virtual IStringVal & getColumnLabel(IStringVal & s, int column) const;
  67. virtual IStringVal & getColumnEclType(IStringVal & s, int column) const;
  68. virtual IStringVal & getColumnXmlType(IStringVal & s, int column) const;
  69. virtual bool isSigned(int column) const;
  70. virtual bool isEBCDIC(int column) const;
  71. virtual bool isBigEndian(int column) const;
  72. virtual unsigned getColumnRawType(int column) const;
  73. virtual unsigned getColumnRawSize(int column) const;
  74. virtual IStringVal & getXmlSchema(IStringVal & s, bool addHeader) const;
  75. virtual IStringVal & getXmlXPathSchema(IStringVal & str, bool addHeader) const;
  76. virtual unsigned getNumKeyedColumns() const;
  77. virtual bool hasSetTranslation(int column) const;
  78. virtual bool hasGetTranslation(int column) const;
  79. virtual IStringVal & getNaturalColumnLabel(IStringVal &s, int column) const;
  80. virtual bool isVirtual(int column) const;
  81. void calcFieldOffsets(const byte * data, unsigned * offsets) const;
  82. inline bool isFixedSize() const { return fixedSize; }
  83. inline char queryFlags(int column) const { return columns.item(column).flag; }
  84. inline const CResultSetColumnInfo & queryColumn(int column) const { return columns.item(column); }
  85. inline ITypeInfo * queryType(int column) const { return columns.item(column).type; }
  86. inline const char * queryXPath(int column) const { return meta->queryXPath(column); }
  87. void getXmlSchema(ISchemaBuilder & builder, bool useXPath) const;
  88. unsigned queryColumnIndex(unsigned firstField, const char * fieldName) const;
  89. inline IFvDataSourceMetaData* getMeta() const { return meta; };
  90. inline CResultSetColumnInfo& getColumn(int column) const { return columns.item(column); };
  91. protected:
  92. IFvDataSourceMetaData * meta;
  93. CIArrayOf<CResultSetColumnInfo> columns;
  94. bool fixedSize;
  95. bool alwaysUseXPath;
  96. };
  97. //Extend the Result interface with the stateless functions required by the cursors
  98. interface IExtendedNewResultSet : extends INewResultSet
  99. {
  100. virtual IExtendedNewResultSet * cloneForFilter() = 0;
  101. virtual bool fetch(MemoryBuffer & out, __int64 fileoffset) = 0;
  102. virtual bool fetchRaw(MemoryBuffer & out, __int64 fileoffset) = 0;
  103. virtual bool getRow(MemoryBuffer & out, __int64 row) = 0;
  104. virtual bool getRawRow(MemoryBuffer & out, __int64 row) = 0;
  105. virtual bool isMappedIndexField(unsigned columnIndex) = 0;
  106. virtual void onOpen() = 0;
  107. virtual void onClose() = 0;
  108. virtual IFvDataSource * queryDataSource() = 0;
  109. };
  110. class CResultSetBase : public CInterface, implements IExtendedNewResultSet
  111. {
  112. public:
  113. IMPLEMENT_IINTERFACE;
  114. //interface IResultSet
  115. virtual IResultSetCursor * createCursor();
  116. virtual IFilteredResultSet * createFiltered();
  117. protected:
  118. const CResultSetMetaData & getMeta() { return static_cast<const CResultSetMetaData &>(getMetaData()); }
  119. CResultSetCursor * doCreateCursor();
  120. };
  121. class CResultSet : public CResultSetBase
  122. {
  123. public:
  124. CResultSet(IFvDataSource * _dataSource, bool _useXPath);
  125. //interface IResultSet
  126. virtual int findColumn(const char * columnName) const;
  127. virtual const IResultSetMetaData & getMetaData() const;
  128. virtual __int64 getNumRows() const;
  129. virtual bool supportsRandomSeek() const;
  130. virtual IExtendedNewResultSet * cloneForFilter();
  131. virtual bool fetch(MemoryBuffer & out, __int64 fileoffset);
  132. virtual bool fetchRaw(MemoryBuffer & out, __int64 fileoffset);
  133. virtual bool getRow(MemoryBuffer & out, __int64 row);
  134. virtual bool getRawRow(MemoryBuffer & out, __int64 row);
  135. virtual bool isMappedIndexField(unsigned columnIndex);
  136. virtual void onOpen() { dataSource->onOpen(); }
  137. virtual void onClose() { dataSource->onClose(); }
  138. virtual IFvDataSource * queryDataSource() { return dataSource; }
  139. void setColumnMapping(IDistributedFile * df);
  140. protected:
  141. void calcMappedFields();
  142. protected:
  143. CResultSetMetaData meta;
  144. Linked<IFvDataSource> dataSource;
  145. BoolArray mappedFields;
  146. CriticalSection cs;
  147. };
  148. class CColumnFilter : public CInterface
  149. {
  150. public:
  151. CColumnFilter(unsigned _whichColumn, ITypeInfo * _type, bool _isMappedIndexField)
  152. : whichColumn(_whichColumn)
  153. { type.set(_type); optimized = false; isMappedIndexField = _isMappedIndexField; subLen = 0; }
  154. void addValue(unsigned lenText, const char * value);
  155. bool isValid(const byte * rowValue, const unsigned * offsets);
  156. bool optimizeFilter(IFvDataSource * dataSource);
  157. protected:
  158. bool matches(const byte * rowValue, size32_t valueLen, const byte * value);
  159. protected:
  160. MemoryAttrArray values;
  161. OwnedITypeInfo type;
  162. unsigned subLen;
  163. unsigned whichColumn;
  164. bool optimized;
  165. bool isMappedIndexField;
  166. };
  167. typedef CIArrayOf<CColumnFilter> ColumnFilterArray;
  168. class CIndirectResultSet : public CResultSetBase
  169. {
  170. public:
  171. CIndirectResultSet(IExtendedNewResultSet * _parent)
  172. : parent(_parent), meta(static_cast<const CResultSetMetaData &>(_parent->getMetaData()))
  173. {
  174. }
  175. virtual const IResultSetMetaData & getMetaData() const
  176. {
  177. return parent->getMetaData();
  178. }
  179. virtual __int64 getNumRows() const
  180. {
  181. return parent->getNumRows();
  182. }
  183. virtual bool supportsRandomSeek() const
  184. {
  185. return parent->supportsRandomSeek();
  186. }
  187. virtual IExtendedNewResultSet * cloneForFilter()
  188. {
  189. return NULL;
  190. }
  191. virtual bool fetch(MemoryBuffer & out, __int64 fileoffset)
  192. {
  193. return parent->fetch(out, fileoffset);
  194. }
  195. virtual bool fetchRaw(MemoryBuffer & out, __int64 fileoffset)
  196. {
  197. return parent->fetchRaw(out, fileoffset);
  198. }
  199. virtual bool getRow(MemoryBuffer & out, __int64 row)
  200. {
  201. return parent->getRow(out, row);
  202. }
  203. virtual bool getRawRow(MemoryBuffer & out, __int64 row)
  204. {
  205. return parent->getRawRow(out, row);
  206. }
  207. virtual bool isMappedIndexField(unsigned columnIndex)
  208. {
  209. return parent->isMappedIndexField(columnIndex);
  210. }
  211. virtual void onOpen()
  212. {
  213. parent->onOpen();
  214. }
  215. virtual void onClose()
  216. {
  217. parent->onClose();
  218. }
  219. virtual IFvDataSource * queryDataSource()
  220. {
  221. return parent->queryDataSource();
  222. }
  223. protected:
  224. Linked<IExtendedNewResultSet> parent;
  225. const CResultSetMetaData & meta;
  226. };
  227. class CFilteredResultSet : public CIndirectResultSet
  228. {
  229. public:
  230. CFilteredResultSet(IExtendedNewResultSet * parent, ColumnFilterArray & _filters);
  231. // CResultSetFilteredCursor(const CResultSetMetaData & _meta, CResultSet * _resultSet, MemoryBuffer & buffer);
  232. ~CFilteredResultSet();
  233. virtual bool getRow(MemoryBuffer & out, __int64 row);
  234. virtual bool getRawRow(MemoryBuffer & out, __int64 row);
  235. virtual __int64 getNumRows() const;
  236. protected:
  237. void initExtra();
  238. bool rowMatchesFilter(const byte * row);
  239. __int64 translateRow(__int64 row);
  240. protected:
  241. ColumnFilterArray filters;
  242. UInt64Array validPositions;
  243. unsigned * offsets;
  244. bool readAll;
  245. };
  246. class CFetchFilteredResultSet : public CIndirectResultSet
  247. {
  248. public:
  249. CFetchFilteredResultSet(IExtendedNewResultSet * _parent, const CStrColumnFilter & _filters);
  250. virtual IFilteredResultSet * createFiltered() { UNIMPLEMENTED; } // Would need to clone filters into new resultset
  251. virtual bool getRow(MemoryBuffer & out, __int64 row);
  252. virtual bool getRawRow(MemoryBuffer & out, __int64 row);
  253. virtual __int64 getNumRows() const;
  254. protected:
  255. UInt64Array validOffsets;
  256. };
  257. class CResultSetCursor : implements IExtendedResultSetCursor, public CInterface
  258. {
  259. public:
  260. CResultSetCursor(const CResultSetMetaData & _meta, IExtendedNewResultSet * _resultSet);
  261. ~CResultSetCursor();
  262. IMPLEMENT_IINTERFACE;
  263. //interface IResultSet, IResultSetCursor shared
  264. virtual bool absolute(__int64 row);
  265. virtual bool first();
  266. virtual IResultSetCursor * getChildren(int columnIndex) const;
  267. virtual bool getIsAll(int columnIndex) const;
  268. virtual IDataVal & getRaw(IDataVal &d, int columnIndex);
  269. virtual const IResultSetMetaData & getMetaData() const;
  270. virtual __int64 getNumRows() const;
  271. virtual bool isValid() const;
  272. virtual bool next();
  273. virtual INewResultSet * queryResultSet() { return resultSet; }
  274. virtual bool supportsRandomSeek() const;
  275. virtual IStringVal & getDisplayText(IStringVal &ret, int columnIndex);
  276. virtual IStringVal & getXml(IStringVal & ret, int columnIndex);
  277. virtual IStringVal & getXmlRow(IStringVal &ret);
  278. virtual void beginWriteXmlRows(IXmlWriter & writer);
  279. virtual void writeXmlRow(IXmlWriter &writer);
  280. virtual void endWriteXmlRows(IXmlWriter & writer);
  281. virtual void writeXmlItem(IXmlWriter &writer);
  282. //IExtendedResultSetCursor
  283. virtual void noteRelatedFileChanged() {}
  284. protected:
  285. bool getBoolean(int columnIndex);
  286. void calcFieldOffsets();
  287. void init(IExtendedNewResultSet * _resultSet);
  288. bool isMappedIndexField(unsigned columnIndex) { return resultSet->isMappedIndexField(columnIndex); }
  289. const byte * getColumn(unsigned idx) const { return (const byte *)curRowData.toByteArray() + offsets[idx]; }
  290. void writeXmlText(IXmlWriter &writer, int columnIndex, const char *tag=NULL);
  291. virtual __int64 getCurRow() const;
  292. virtual __int64 translateRow(__int64 row) const;
  293. protected:
  294. const CResultSetMetaData & meta;
  295. Owned<IExtendedNewResultSet> resultSet;
  296. MemoryBuffer curRowData;
  297. __int64 curRow;
  298. unsigned * offsets;
  299. };
  300. //---------------------------------------------------------------------------
  301. class IndirectResultSetCursor : implements IExtendedResultSetCursor, public CInterface
  302. {
  303. public:
  304. IMPLEMENT_IINTERFACE;
  305. //interface IResultSet, IResultSetCursor shared
  306. virtual bool absolute(__int64 row);
  307. virtual bool first();
  308. virtual IResultSetCursor * getChildren(int columnIndex) const;
  309. virtual bool getIsAll(int columnIndex) const;
  310. virtual IDataVal & getRaw(IDataVal &d, int columnIndex);
  311. virtual __int64 getNumRows() const;
  312. virtual bool isValid() const;
  313. virtual bool next();
  314. virtual INewResultSet * queryResultSet();
  315. virtual IStringVal & getDisplayText(IStringVal &ret, int columnIndex);
  316. virtual IStringVal & getXmlRow(IStringVal &ret);
  317. virtual void beginWriteXmlRows(IXmlWriter & writer);
  318. virtual void writeXmlRow(IXmlWriter &writer);
  319. virtual void endWriteXmlRows(IXmlWriter & writer);
  320. virtual void writeXmlItem(IXmlWriter &writer);
  321. virtual void noteRelatedFileChanged();
  322. protected:
  323. virtual IExtendedResultSetCursor * queryBase() = 0;
  324. virtual const IExtendedResultSetCursor * queryBase() const
  325. {
  326. return const_cast<IndirectResultSetCursor *>(this)->queryBase();
  327. }
  328. };
  329. class NotifyingResultSetCursor : public IndirectResultSetCursor
  330. {
  331. public:
  332. NotifyingResultSetCursor(IExtendedResultSetCursor * _cursor) : cursor(_cursor) {}
  333. inline void addDependent(IExtendedResultSetCursor & next) { dependents.append(OLINK(next)); }
  334. virtual bool absolute(__int64 row);
  335. virtual bool first();
  336. virtual bool next();
  337. virtual void noteRelatedFileChanged();
  338. virtual IExtendedResultSetCursor * queryBase() { return cursor; }
  339. protected:
  340. void notifyChanged();
  341. protected:
  342. Linked<IExtendedResultSetCursor> cursor;
  343. IArrayOf<IExtendedResultSetCursor> dependents;
  344. };
  345. class DelayedFilteredResultSetCursor : public IndirectResultSetCursor
  346. {
  347. public:
  348. DelayedFilteredResultSetCursor(INewResultSet * _resultSet);
  349. virtual IExtendedResultSetCursor * queryBase();
  350. virtual void ensureFiltered();
  351. virtual void noteRelatedFileChanged();
  352. void clearFilters();
  353. inline void clearFilter(unsigned columnIndex)
  354. {
  355. clearCursor();
  356. filtered->clearFilter(columnIndex);
  357. }
  358. inline void addFilter(unsigned columnIndex, unsigned length, const char * utf8Value)
  359. {
  360. clearCursor();
  361. filtered->addFilter(columnIndex, length, utf8Value);
  362. }
  363. inline void addNaturalFilter(unsigned columnIndex, unsigned length, const char * utf8Value)
  364. {
  365. clearCursor();
  366. filtered->addNaturalFilter(columnIndex, length, utf8Value);
  367. }
  368. protected:
  369. void clearCursor();
  370. protected:
  371. Linked<IFilteredResultSet> filtered;
  372. Owned<INewResultSet> resultSet;
  373. Owned<IExtendedResultSetCursor> cursor;
  374. };
  375. //---------------------------------------------------------------------------
  376. class CFilteredResultSetBuilder : implements IFilteredResultSet, public CInterface
  377. {
  378. public:
  379. CFilteredResultSetBuilder(IExtendedNewResultSet * _resultSet);
  380. IMPLEMENT_IINTERFACE
  381. virtual INewResultSet * create();
  382. virtual void addFilter(unsigned columnIndex, const char * value);
  383. virtual void addFilter(unsigned columnIndex, unsigned len, const char * value);
  384. virtual void addNaturalFilter(unsigned columnIndex, unsigned len, const char * value);
  385. virtual void clearFilter(unsigned columnIndex);
  386. virtual void clearFilters();
  387. protected:
  388. CIArrayOf<CStrColumnFilter> filters;
  389. Owned<IExtendedNewResultSet> resultSet;
  390. };
  391. class ADataSource;
  392. class CResultSetFactoryBase : public CInterface, implements IResultSetFactory
  393. {
  394. public:
  395. CResultSetFactoryBase(const char * _username, const char * _password);
  396. CResultSetFactoryBase(ISecManager &secmgr, ISecUser &secuser);
  397. IMPLEMENT_IINTERFACE
  398. protected:
  399. StringAttr username;
  400. StringAttr password;
  401. Owned<ISecManager> secMgr;
  402. Owned<ISecUser> secUser;
  403. };
  404. class CResultSetFactory : public CResultSetFactoryBase
  405. {
  406. public:
  407. CResultSetFactory(const char * _username, const char * _password);
  408. CResultSetFactory(ISecManager &secmgr, ISecUser &secuser);
  409. virtual INewResultSet * createNewResultSet(IConstWUResult * wuResult, const char * wuid);
  410. virtual INewResultSet * createNewFileResultSet(const char * logicalFile, const char * cluster);
  411. virtual INewResultSet * createNewResultSet(const char * wuid, unsigned sequence, const char * name);
  412. virtual INewResultSet * createNewFileResultSet(const char * logicalFile);
  413. virtual IResultSetMetaData * createResultSetMeta(IConstWUResult * wuResult);
  414. virtual IResultSetMetaData * createResultSetMeta(const char * wuid, unsigned sequence, const char * name);
  415. protected:
  416. CResultSet * createResultSet(IFvDataSource * ds, bool _useXPath);
  417. IDistributedFile * lookupLogicalName(const char * logicalName);
  418. };
  419. #endif // _resultsetscm_SCM_INCL
  420. //end