fvtransform.ipp 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287
  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 FVTRANSFORM_IPP
  14. #define FVTRANSFORM_IPP
  15. #include "fvrelate.hpp"
  16. #include "hqlexpr.hpp"
  17. #include "thorplugin.hpp"
  18. struct CardinalityElement
  19. {
  20. // static const unsigned Unbounded = (unsigned)-1; // vc6 doesn't like this.
  21. enum { Unbounded = -1 }; // almost the same
  22. public:
  23. CardinalityElement() { min = 0; max = 0; }
  24. void init(unsigned len, const char * _text);
  25. public:
  26. unsigned min;
  27. unsigned max;
  28. StringAttr text;
  29. };
  30. struct CardinalityMapping
  31. {
  32. public:
  33. inline CardinalityMapping() {}
  34. inline CardinalityMapping(const char * _text) { init(_text); }
  35. void init(const char * text);
  36. public:
  37. CardinalityElement primary;
  38. CardinalityElement secondary;
  39. };
  40. void getInvertedCardinality(StringBuffer & out, const char * cardinality);
  41. //---------------------------------------------------------------------------
  42. //Field values are always extracted/added as utf8 values. The transformation functions may need to translate formats to work correctly
  43. //MORE: Support different types, and auto translate from string<->utf8<->unicode
  44. class FILEVIEW_API ViewFieldTransformer : public CInterface
  45. {
  46. public:
  47. ViewFieldTransformer(IAtom * _name)
  48. : name(_name)
  49. {}
  50. inline bool matches(IIdAtom * search) const { return name == lower(search); }
  51. inline IAtom * queryName() const { return name; }
  52. virtual ViewFieldTransformer * bind(const HqlExprArray & args);
  53. void transform(MemoryAttr & utfTarget, const MemoryAttr & utfSrc);
  54. protected:
  55. virtual void transform(unsigned & lenTarget, char * & target, unsigned lenSource, const char * source) = 0;
  56. protected:
  57. IAtom * name;
  58. };
  59. class FILEVIEW_API ViewFailTransformer : public ViewFieldTransformer
  60. {
  61. public:
  62. ViewFailTransformer();
  63. virtual void transform(unsigned & lenTarget, char * & target, unsigned lenSource, const char * source);
  64. };
  65. class FILEVIEW_API ViewExceptionTransformer : public ViewFieldTransformer
  66. {
  67. public:
  68. ViewExceptionTransformer(IException * _e);
  69. virtual void transform(unsigned & lenTarget, char * & target, unsigned lenSource, const char * source);
  70. private:
  71. Linked<IException> e;
  72. };
  73. class FILEVIEW_API ViewAddTransformer : public ViewFieldTransformer
  74. {
  75. public:
  76. ViewAddTransformer();
  77. ViewAddTransformer(const HqlExprArray & _args);
  78. virtual void transform(unsigned & lenTarget, char * & target, unsigned lenSource, const char * source);
  79. virtual ViewFieldTransformer * bind(const HqlExprArray & args);
  80. protected:
  81. HqlExprArray args;
  82. };
  83. class FILEVIEW_API ViewFieldUtf8Transformer : public ViewFieldTransformer
  84. {
  85. public:
  86. ViewFieldUtf8Transformer(IAtom * _name, utf8FieldTransformerFunction _function)
  87. : ViewFieldTransformer(_name), function(_function)
  88. {}
  89. protected:
  90. virtual void transform(unsigned & lenTarget, char * & target, unsigned lenSource, const char * source);
  91. protected:
  92. utf8FieldTransformerFunction function;
  93. };
  94. class FILEVIEW_API ViewFieldUnicodeTransformer : public ViewFieldTransformer
  95. {
  96. public:
  97. ViewFieldUnicodeTransformer(IAtom * _name, unicodeFieldTransformerFunction _function)
  98. : ViewFieldTransformer(_name), function(_function)
  99. {}
  100. protected:
  101. virtual void transform(unsigned & lenTarget, char * & target, unsigned lenSource, const char * source);
  102. protected:
  103. unicodeFieldTransformerFunction function;
  104. };
  105. class FILEVIEW_API ViewFieldStringTransformer : public ViewFieldTransformer
  106. {
  107. public:
  108. ViewFieldStringTransformer(IAtom * _name, stringFieldTransformerFunction _function)
  109. : ViewFieldTransformer(_name), function(_function)
  110. {}
  111. protected:
  112. virtual void transform(unsigned & lenTarget, char * & target, unsigned lenSource, const char * source);
  113. protected:
  114. stringFieldTransformerFunction function;
  115. };
  116. class FILEVIEW_API ViewFieldECLTransformer : public ViewFieldTransformer
  117. {
  118. friend class ViewFieldBoundECLTransformer;
  119. public:
  120. ViewFieldECLTransformer(IHqlExpression * _function)
  121. : ViewFieldTransformer(_function->queryName()), function(_function)
  122. {}
  123. protected:
  124. virtual void transform(unsigned & lenTarget, char * & target, unsigned lenSource, const char * source);
  125. virtual ViewFieldTransformer * bind(const HqlExprArray & args);
  126. void transform(unsigned & lenTarget, char * & target, unsigned lenSource, const char * source, const HqlExprArray & extraArgs);
  127. protected:
  128. LinkedHqlExpr function;
  129. };
  130. class FILEVIEW_API ViewFieldBoundECLTransformer : public ViewFieldTransformer
  131. {
  132. public:
  133. ViewFieldBoundECLTransformer(ViewFieldECLTransformer * _transformer, const HqlExprArray & _args)
  134. : ViewFieldTransformer(_transformer->queryName()), transformer(_transformer)
  135. {
  136. appendArray(args, _args);
  137. }
  138. protected:
  139. virtual void transform(unsigned & lenTarget, char * & target, unsigned lenSource, const char * source);
  140. protected:
  141. Linked<ViewFieldECLTransformer> transformer;
  142. HqlExprArray args;
  143. };
  144. typedef CIArrayOf<ViewFieldTransformer> ViewFieldTransformerArray;
  145. class ViewServiceEntry : public CInterface
  146. {
  147. public:
  148. StringAttr name;
  149. //HINSTANCE handle; // to prevent it being loaded and unloaded.
  150. ViewFieldTransformerArray transformers;
  151. };
  152. class FILEVIEW_API ViewTransformerRegistry : implements IViewTransformerRegistry
  153. {
  154. public:
  155. virtual void addFieldStringTransformer(const char * name, stringFieldTransformerFunction func);
  156. virtual void addFieldUtf8Transformer(const char * name, utf8FieldTransformerFunction func);
  157. virtual void addFieldUnicodeTransformer(const char * name, unicodeFieldTransformerFunction func);
  158. virtual void addPlugins(const char * pluginname);
  159. void addTransformer(ViewFieldTransformer * ownedTransformer);
  160. ViewFieldTransformer * resolve(const char * name, const HqlExprArray & args);
  161. ViewFieldTransformer * resolve(const char * servicename, const char * functionname, const HqlExprArray & args);
  162. protected:
  163. void addServiceDefinition(IHqlExpression * service);
  164. void * resolveExternal(IHqlExpression * funcdef);
  165. ViewFieldTransformer * createTransformer(IHqlExpression * funcdef);
  166. protected:
  167. //Could use a hash table if the number of entries is likely to get large, unlikely to be faster though
  168. ViewFieldTransformerArray transformers;
  169. CIArrayOf<ViewServiceEntry> plugins;
  170. Owned<SafePluginMap> loadedPlugins;
  171. Owned<IEclRepository> dataServer;
  172. SimplePluginCtx pluginCtx;
  173. };
  174. //---------------------------------------------------------------------------
  175. void translateValue(MemoryAttr & result, const MemoryAttr & value, const ViewFieldTransformerArray & transforms);
  176. bool containsFail(const ViewFieldTransformerArray & transforms);
  177. class FILEVIEW_API ViewJoinColumn : public CInterface
  178. {
  179. public:
  180. ViewJoinColumn(unsigned _whichColumn, const ViewFieldTransformerArray & _getTransforms, const ViewFieldTransformerArray & _setTransforms);
  181. void addFilter(IFilteredResultSet * resultSet, const MemoryAttr & value);
  182. void clearFilter(IFilteredResultSet * resultSet);
  183. void getValue(MemoryAttr & value, IResultSetCursor * cursor);
  184. unsigned queryBaseColumn() const { return whichColumn; }
  185. bool canGet() const { return !getContainsFail; }
  186. bool canSet() const { return !setContainsFail; }
  187. bool hasGetTranslation() const { return getTransforms.ordinality() != 0; }
  188. bool hasSetTranslation() const { return setTransforms.ordinality() != 0; }
  189. protected:
  190. unsigned whichColumn;
  191. ViewFieldTransformerArray getTransforms;
  192. ViewFieldTransformerArray setTransforms;
  193. bool getContainsFail;
  194. bool setContainsFail;
  195. };
  196. typedef CIArrayOf<ViewJoinColumn> ViewJoinColumnArray;
  197. struct FieldTransformInfo : public CInterface
  198. {
  199. //output
  200. unsigned datasetColumn;
  201. unsigned column;
  202. ViewFieldTransformerArray getTransforms;
  203. ViewFieldTransformerArray setTransforms;
  204. StringAttr naturalName;
  205. Owned<ITypeInfo> type;
  206. };
  207. typedef CIArrayOf<FieldTransformInfo> FieldTransformInfoArray;
  208. void parseFileColumnMapping(FieldTransformInfoArray & mappings, const char * text, const IResultSetMetaData & fieldMeta);
  209. void parseColumnMappingList(FieldTransformInfoArray & results,
  210. const IResultSetMetaData & fieldMeta,
  211. bool isDatasetAllowed, // if non null dataset.x is allowed, and column returned via pointer
  212. const char * text);
  213. #endif