dataaccess/serialization/xml/Serializer.cpp
Go to the documentation of this file.
1 /* Copyright (C) 2008 National Institute For Space Research (INPE) - Brazil.
2 
3  This file is part of the TerraLib - a Framework for building GIS enabled applications.
4 
5  TerraLib is free software: you can redistribute it and/or modify
6  it under the terms of the GNU Lesser General Public License as published by
7  the Free Software Foundation, either version 3 of the License,
8  or (at your option) any later version.
9 
10  TerraLib is distributed in the hope that it will be useful,
11  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  GNU Lesser General Public License for more details.
14 
15  You should have received a copy of the GNU Lesser General Public License
16  along with TerraLib. See COPYING. If not, write to
17  TerraLib Team at <terralib-team@terralib.org>.
18  */
19 
20 /*!
21  \file terralib/dataaccess/serialization/xml/DataSetType.cpp
22 
23  \brief Support for DataSetType serialization.
24 */
25 
26 // TerraLib
27 #include "../../../Version.h"
28 #include "../../../common/BoostUtils.h"
29 #include "../../../core/filesystem/FileSystem.h"
30 #include "../../../core/uri/Utils.h"
31 #include "../../../core/utils/Platform.h"
32 #include "../../../datatype/AbstractData.h"
33 #include "../../../datatype/Enums.h"
34 #include "../../../datatype/serialization/xml/Serializer.h"
35 #include "../../../datatype/StringProperty.h"
36 #include "../../../datatype/Utils.h"
37 #include "../../../geometry/Geometry.h"
38 #include "../../../geometry/WKTReader.h"
39 #include "../../../xml/AbstractWriter.h"
40 #include "../../../xml/AbstractWriterFactory.h"
41 #include "../../../xml/Reader.h"
42 #include "../../../xml/ReaderFactory.h"
43 #include "../../dataset/DataSetType.h"
44 #include "../../datasource/DataSourceCapabilities.h"
45 #include "../../datasource/DataSourceCatalog.h"
46 #include "../../datasource/DataSourceInfo.h"
47 #include "../../datasource/DataSourceInfoManager.h"
48 #include "../../query/BinaryFunction.h"
49 #include "../../query/BinaryOpEncoder.h"
50 #include "../../query/DataSetName.h"
51 #include "../../query/Distinct.h"
52 #include "../../query/Expression.h"
53 #include "../../query/Field.h"
54 #include "../../query/FromItem.h"
55 #include "../../query/Function.h"
56 #include "../../query/FunctionEncoder.h"
57 #include "../../query/GroupByItem.h"
58 #include "../../query/Having.h"
59 #include "../../query/Join.h"
60 #include "../../query/JoinConditionOn.h"
61 #include "../../query/JoinConditionUsing.h"
62 #include "../../query/Literal.h"
63 #include "../../query/LiteralDouble.h"
64 #include "../../query/LiteralGeom.h"
65 #include "../../query/LiteralInt16.h"
66 #include "../../query/LiteralInt32.h"
67 #include "../../query/LiteralInt64.h"
68 #include "../../query/LiteralString.h"
69 #include "../../query/OrderByItem.h"
70 #include "../../query/PropertyName.h"
71 #include "../../query/Select.h"
72 #include "../../query/SQLDialect.h"
73 #include "../../query/SQLFunctionEncoder.h"
74 #include "../../query/TemplateEncoder.h"
75 #include "../../query/UnaryOpEncoder.h"
76 #include "../../query/Where.h"
77 #include "../../Exception.h"
78 #include "Serializer.h"
79 
80 // STL
81 #include <cassert>
82 #include <fstream>
83 #include <memory>
84 
85 // Boost
86 #include <boost/algorithm/string/case_conv.hpp>
87 #include <boost/format.hpp>
88 #include <boost/lexical_cast.hpp>
89 #include <boost/algorithm/string/replace.hpp>
90 #include <boost/filesystem.hpp>
91 
92 void te::serialize::xml::ReadDataSourceInfo(const std::string& datasourcesFileName)
93 {
94  if(!te::core::FileSystem::isRegularFile(datasourcesFileName))
95  return;
96 
97  std::unique_ptr<te::xml::Reader> xmlReader(te::xml::ReaderFactory::make());
98  xmlReader->setValidationScheme(false);
99  xmlReader->setDoSchema(false);
100  xmlReader->read(datasourcesFileName);
101 
102  if(!xmlReader->next())
103  throw te::da::Exception((boost::format(TE_TR("Could not read data source information in file: %1%.")) % datasourcesFileName).str());
104 
105  if(xmlReader->getNodeType() != te::xml::START_ELEMENT)
106  throw te::da::Exception((boost::format(TE_TR("Error reading the document %1%, the start element wasn't found.")) % datasourcesFileName).str());
107 
108  if(xmlReader->getElementLocalName() != "DataSourceList")
109  throw te::da::Exception((boost::format(TE_TR("The first tag in the document %1% is not 'DataSourceList'.")) % datasourcesFileName).str());
110 
111  if(!xmlReader->next())
112  return;
113 
114  while((xmlReader->getNodeType() == te::xml::START_ELEMENT) &&
115  (xmlReader->getElementLocalName() == "DataSource"))
116  {
119  }
120 
121  return;
122 }
123 
125 {
126  std::unique_ptr<te::da::DataSourceInfo> ds(new te::da::DataSourceInfo);
127 
128  ds->setId(reader.getAttr("id"));
129  ds->setType(reader.getAttr("type"));
130  ds->setAccessDriver(reader.getAttr("access_driver"));
131 
132  /* Title Element */
133  reader.next();
134  assert(reader.getNodeType() == te::xml::START_ELEMENT);
135  assert(reader.getElementLocalName() == "Title");
136  reader.next();
137  assert(reader.getNodeType() == te::xml::VALUE);
138  ds->setTitle(reader.getElementValue());
139  reader.next();
140  assert(reader.getNodeType() == te::xml::END_ELEMENT);
141 
142  /* Description Element */
143  reader.next();
144  assert(reader.getNodeType() == te::xml::START_ELEMENT);
145  assert(reader.getElementLocalName() == "Description");
146  reader.next();
147 
148  if(reader.getNodeType() == te::xml::VALUE)
149  {
150  ds->setDescription(reader.getElementValue());
151  reader.next();
152  }
153 
154  // if only white spaces
155  if (reader.getNodeType() == te::xml::WHITESPACE)
156  reader.next();
157 
158  assert(reader.getNodeType() == te::xml::END_ELEMENT);
159 
160  /* ConnectionInfo Element */
161  reader.next();
162  assert(reader.getNodeType() == te::xml::START_ELEMENT);
163 
164  assert(reader.getElementLocalName() == "URI");
165  reader.next();
166 
167  if (reader.getNodeType() == te::xml::VALUE)
168  {
169  ds->setConnInfo(te::core::URIDecode(reader.getElementValue()));
170  reader.next();
171  }
172 
173  assert(reader.getNodeType() == te::xml::END_ELEMENT); // End of ConnectionInfo Element
174  reader.next();
175 
176  assert(reader.getNodeType() == te::xml::END_ELEMENT); // End of DataSource Element
177  reader.next();
178 
179  return ds.release();
180 }
181 
182 void te::serialize::xml::Save(const std::string& fileName)
183 {
184  std::unique_ptr<te::xml::AbstractWriter> w(te::xml::AbstractWriterFactory::make());
185 
186  w->setURI(fileName);
187 
188  Save(*w.get());
189 }
190 
192 {
193  std::string schema_loc = te::core::FindInTerraLibPath("share/terralib/schemas/terralib/dataaccess/dataaccess.xsd");
194 
195  boost::replace_all(schema_loc, " ", "%20");
196 
197  schema_loc = "file:///" + schema_loc;
198 
199  writer.writeStartDocument("UTF-8", "no");
200 
201  writer.setRootNamespaceURI("http://www.terralib.org/schemas/dataaccess");
202 
203  writer.writeStartElement("te_da:DataSourceList");
204 
205  writer.writeAttribute("xmlns:xsd", "http://www.w3.org/2001/XMLSchema-instance");
206  writer.writeAttribute("xmlns:te_common", "http://www.terralib.org/schemas/common");
207  writer.writeAttribute("xmlns", "http://www.terralib.org/schemas/dataaccess");
208  writer.writeAttribute("xsd:schemaLocation", "http://www.terralib.org/schemas/dataaccess " + schema_loc);
209  writer.writeAttribute("version", TERRALIB_VERSION_STRING);
210  writer.writeAttribute("release", "2013-01-01");
211 
215 
216  for(it=itBegin; it!=itEnd; ++it)
217  {
218  writer.writeStartElement("te_da:DataSource");
219 
220  writer.writeAttribute("id", it->second->getId());
221  writer.writeAttribute("type", it->second->getType());
222  writer.writeAttribute("access_driver", it->second->getAccessDriver());
223 
224  writer.writeStartElement("te_da:Title");
225  writer.writeValue(it->second->getTitle());
226  writer.writeEndElement("te_da:Title");
227 
228  writer.writeStartElement("te_da:Description");
229  writer.writeValue(it->second->getDescription());
230  writer.writeEndElement("te_da:Description");
231 
232  writer.writeStartElement("te_da:URI");
233  writer.writeValue(te::core::URIEncode(it->second->getConnInfoAsString()));
234  writer.writeEndElement("te_da:URI");
235 
236  writer.writeEndElement("te_da:DataSource");
237  }
238 
239  writer.writeEndElement("te_da:DataSourceList");
240 
241  writer.writeToFile();
242 }
243 
245 {
246  assert(reader.getNodeType() == te::xml::START_ELEMENT);
247  assert(reader.getElementLocalName() == "DataSourceCatalog");
248 
249  //reader.next();
250  //assert(reader.getNodeType() == te::xml::START_ELEMENT);
251  //assert(reader.getElementLocalName() == "Name");
252 
253  //reader.next();
254  //assert(reader.getNodeType() == te::xml::VALUE);
255 
256  reader.next();
257  assert(reader.getNodeType() == te::xml::START_ELEMENT);
258  assert(reader.getElementLocalName() == "DataSetTypes");
259 
260  reader.next();
261 
262  std::unique_ptr<te::da::DataSourceCatalog> catalog(new te::da::DataSourceCatalog);
263 
264  while(reader.getNodeType() == te::xml::START_ELEMENT &&
265  reader.getElementLocalName() == "DataSetType")
266  {
268  catalog->add(dt);
269  }
270 
271  assert(reader.getNodeType() == te::xml::END_ELEMENT); // End of DataSetTypes Element
272  reader.next();
273 
274  assert(reader.getNodeType() == te::xml::END_ELEMENT); // End of DataSourceCatalog Element
275  reader.next();
276 
277  return catalog.release();
278 }
279 
280 void te::serialize::xml::Save(const te::da::DataSourceCatalog* catalog, const std::string& fileName)
281 {
282  std::unique_ptr<te::xml::AbstractWriter> w(te::xml::AbstractWriterFactory::make());
283  w->setURI(fileName);
284  Save(catalog, *w.get());
285 }
286 
288 {
289  writer.writeStartDocument("UTF-8", "no");
290 
291  writer.writeStartElement("DataSourceCatalog");
292 
293  writer.writeAttribute("xmlns:xlink", "http://www.w3.org/1999/xlink");
294  writer.writeAttribute("xmlns:xsd", "http://www.w3.org/2001/XMLSchema-instance");
295  writer.writeAttribute("xmlns", "http://www.terralib.org/schemas/da");
296  writer.writeAttribute("xsd:schemaLocation", "http://www.terralib.org/schemas/da C:/Users/gribeiro/Documents/terralib5/trunk/myschemas/terralib/da/catalog.xsd");
297  writer.writeAttribute("version", "5.0.0");
298  writer.writeAttribute("release", "2011-01-01");
299 
300  writer.writeStartElement("DataSetTypes");
301 
302  const std::size_t ndatasets = catalog->getNumberOfDataSets();
303 
304  for(std::size_t i = 0; i < ndatasets; ++i)
305  Save(catalog->getDataSetType(i).get(), writer);
306 
307  writer.writeEndElement("DataSetTypes");
308 
309  writer.writeEndElement("DataSourceCatalog");
310 }
311 
313 {
314  assert(reader.getNodeType() == te::xml::START_ELEMENT);
315  assert(reader.getElementLocalName() == "DataSetType");
316 
317  unsigned int id = reader.getAttrAsUInt32("id");
318  std::string name = reader.getAttr("name");
319  std::string title = reader.getAttr("title");
320 
321  reader.next();
322 
323  std::unique_ptr<te::da::DataSetType> dt(new te::da::DataSetType(name, id));
324 
325  dt->setTitle(title);
326 
327  while(reader.getNodeType() == te::xml::START_ELEMENT &&
328  reader.getElementLocalName() == "Property")
329  {
330  std::unique_ptr<te::dt::Property> p(ReadProperty(reader));
331  dt->add(p.release());
332  }
333 
334  assert(reader.getNodeType() == te::xml::END_ELEMENT); // End of DataSetType Element
335  reader.next();
336 
337  return dt.release();
338 }
339 
341 {
342  writer.writeStartElement("te_da:DataSetType");
343 
344  writer.writeAttribute("id", dt->getId());
345  writer.writeAttribute("name", dt->getName());
346  writer.writeAttribute("title", dt->getTitle());
347 
348  const std::size_t nprops = dt->size();
349 
350  for(std::size_t i = 0; i < nprops; ++i)
351  Save(*(dt->getProperty(i)), writer);
352 
353  writer.writeEndElement("te_da:DataSetType");
354 }
355 
357 {
358  if(accessPolicy == "NO_ACCESS")
359  return te::common::NoAccess;
360  else if (accessPolicy == "R_ACCESS")
361  return te::common::RAccess;
362  else if(accessPolicy == "W_ACCESS")
363  return te::common::WAccess;
364  else if(accessPolicy == "RW_ACCESS")
365  return te::common::RWAccess;
366  else
367  return te::common::NoAccess;
368 }
369 
371 {
372  std::unique_ptr<te::xml::Reader> xmlReader(te::xml::ReaderFactory::make());
373 
374  xmlReader->read(dialectFileName);
375 
376  if(!xmlReader->next())
377  throw te::da::Exception((boost::format(TE_TR("Could not read DataSourceCapabilities information in file: %1%.")) % dialectFileName).str());
378 
379  if(xmlReader->getNodeType() != te::xml::START_ELEMENT)
380  throw te::da::Exception((boost::format(TE_TR("Error reading the document %1%, the start element wasn't found.")) % dialectFileName).str());
381 
382  if(xmlReader->getElementLocalName() != "DataSourceCapabilities")
383  throw te::da::Exception((boost::format(TE_TR("The first tag in the document %1% is not 'DataSourceCapabilities'.")) % dialectFileName).str());
384 
385  xmlReader->next();
386  assert(xmlReader->getNodeType() == te::xml::START_ELEMENT);
387  assert(xmlReader->getElementLocalName() == "DataTypeCapabilities");
388 
390 
391  while(xmlReader->next() &&
392  (xmlReader->getNodeType() == te::xml::START_ELEMENT) &&
393  (xmlReader->getElementLocalName() == "DataType"))
394  {
395  xmlReader->next();
396  assert(xmlReader->getNodeType() == te::xml::VALUE);
397 
398  dtc.setSupport(te::dt::Convert2Terralib(xmlReader->getElementValue()), true);
399 
400  xmlReader->next();
401  assert(xmlReader->getNodeType() == te::xml::END_ELEMENT);
402  }
403 
404  capabilities.setDataTypeCapabilities(dtc);
405 
406  assert(xmlReader->getNodeType() == te::xml::END_ELEMENT); // DataTypeCapabilities
407 
408  xmlReader->next();
409  assert(xmlReader->getNodeType() == te::xml::START_ELEMENT);
410  assert(xmlReader->getElementLocalName() == "QueryCapabilities");
411 
413 
414  xmlReader->next();
415  assert(xmlReader->getNodeType() == te::xml::START_ELEMENT);
416  assert(xmlReader->getElementLocalName() == "SQLDialect");
417 
418  xmlReader->next();
419  qc.setSupportSQLDialect(xmlReader->getElementValueAsBoolean());
420 
421  xmlReader->next();
422  assert(xmlReader->getNodeType() == te::xml::END_ELEMENT); // SQLDialect
423 
424  xmlReader->next();
425  assert(xmlReader->getNodeType() == te::xml::START_ELEMENT);
426  assert(xmlReader->getElementLocalName() == "SpatialSQLDialect");
427 
428  xmlReader->next();
429  qc.setSupportSpatialSQLDialect(xmlReader->getElementValueAsBoolean());
430 
431  xmlReader->next();
432  assert(xmlReader->getNodeType() == te::xml::END_ELEMENT); // SpatialSQLDialect
433 
434  xmlReader->next();
435  assert(xmlReader->getNodeType() == te::xml::START_ELEMENT);
436  assert(xmlReader->getElementLocalName() == "Insert");
437 
438  xmlReader->next();
439  assert(xmlReader->getNodeType() == te::xml::VALUE);
440  qc.setSupportInsert(xmlReader->getElementValueAsBoolean());
441 
442  xmlReader->next();
443  assert(xmlReader->getNodeType() == te::xml::END_ELEMENT); // Insert
444 
445  xmlReader->next();
446  assert(xmlReader->getNodeType() == te::xml::START_ELEMENT);
447  assert(xmlReader->getElementLocalName() == "Update");
448 
449  xmlReader->next();
450  assert(xmlReader->getNodeType() == te::xml::VALUE);
451  qc.setSupportUpdate(xmlReader->getElementValueAsBoolean());
452 
453  xmlReader->next();
454  assert(xmlReader->getNodeType() == te::xml::END_ELEMENT); // Update
455 
456  xmlReader->next();
457  assert(xmlReader->getNodeType() == te::xml::START_ELEMENT);
458  assert(xmlReader->getElementLocalName() == "Delete");
459 
460  xmlReader->next();
461  assert(xmlReader->getNodeType() == te::xml::VALUE);
462  qc.setSupportDelete(xmlReader->getElementValueAsBoolean());
463 
464  xmlReader->next();
465  assert(xmlReader->getNodeType() == te::xml::END_ELEMENT); // Delete
466 
467  xmlReader->next();
468  assert(xmlReader->getNodeType() == te::xml::START_ELEMENT);
469  assert(xmlReader->getElementLocalName() == "Create");
470 
471  xmlReader->next();
472  assert(xmlReader->getNodeType() == te::xml::VALUE);
473  qc.setSupportCreate(xmlReader->getElementValueAsBoolean());
474 
475  xmlReader->next();
476  assert(xmlReader->getNodeType() == te::xml::END_ELEMENT); // Create
477 
478  xmlReader->next();
479  assert(xmlReader->getNodeType() == te::xml::START_ELEMENT);
480  assert(xmlReader->getElementLocalName() == "Drop");
481 
482  xmlReader->next();
483  assert(xmlReader->getNodeType() == te::xml::VALUE);
484  qc.setSupportDrop(xmlReader->getElementValueAsBoolean());
485 
486  xmlReader->next();
487  assert(xmlReader->getNodeType() == te::xml::END_ELEMENT); // Drop
488 
489  xmlReader->next();
490  assert(xmlReader->getNodeType() == te::xml::START_ELEMENT);
491  assert(xmlReader->getElementLocalName() == "Alter");
492 
493  xmlReader->next();
494  assert(xmlReader->getNodeType() == te::xml::VALUE);
495  qc.setSupportAlter(xmlReader->getElementValueAsBoolean());
496 
497  xmlReader->next();
498  assert(xmlReader->getNodeType() == te::xml::END_ELEMENT); // Alter
499 
500  xmlReader->next();
501  assert(xmlReader->getNodeType() == te::xml::START_ELEMENT);
502  assert(xmlReader->getElementLocalName() == "Select");
503 
504  xmlReader->next();
505  assert(xmlReader->getNodeType() == te::xml::VALUE);
506  qc.setSupportSelect(xmlReader->getElementValueAsBoolean());
507 
508  xmlReader->next();
509  assert(xmlReader->getNodeType() == te::xml::END_ELEMENT); // Select
510 
511  xmlReader->next();
512  assert(xmlReader->getNodeType() == te::xml::START_ELEMENT);
513  assert(xmlReader->getElementLocalName() == "SelectInto");
514 
515  xmlReader->next();
516  assert(xmlReader->getNodeType() == te::xml::VALUE);
517  qc.setSupportSelectInto(xmlReader->getElementValueAsBoolean());
518 
519  xmlReader->next();
520  assert(xmlReader->getNodeType() == te::xml::END_ELEMENT); // SelectInto
521 
522  //----------------------------
523 
524  xmlReader->next();
525  assert(xmlReader->getNodeType() == te::xml::START_ELEMENT);
526  assert(xmlReader->getElementLocalName() == "SpatialTopologicOperators");
527 
528  while(xmlReader->next() &&
529  (xmlReader->getNodeType() == te::xml::START_ELEMENT) &&
530  (xmlReader->getElementLocalName() == "Function"))
531  {
532  te::da::SQLFunctionEncoder* sfe = nullptr;
533 
534  std::string fname = xmlReader->getAttr("name");
535 
536  qc.addSpatialTopologicOperator(fname);
537 
538  xmlReader->next();
539  assert(xmlReader->getNodeType() == te::xml::START_ELEMENT);
540 
541  std::string encoderType = xmlReader->getElementLocalName();
542 
543  if(encoderType == "FunctionEncoder")
544  {
545  std::string alias = xmlReader->getAttr(0);
546  sfe = new te::da::FunctionEncoder(alias);
547  }
548  else if(encoderType == "BinaryOpEncoder")
549  {
550  std::string alias = xmlReader->getAttr(0);
551  sfe = new te::da::BinaryOpEncoder(alias);
552  }
553  else if(encoderType == "UnaryOpEncoder")
554  {
555  std::string alias = xmlReader->getAttr(0);
556  sfe = new te::da::UnaryOpEncoder(alias);
557  }
558  else if(encoderType == "TemplateEncoder")
559  {
560  std::string alias = xmlReader->getAttr(0);
561  std::string temp = xmlReader->getAttr(1);
562  sfe = new te::da::TemplateEncoder(alias, temp);
563  }
564  else
565  {
566  throw te::da::Exception(TE_TR("Unsupported encoder type!"));
567  }
568 
569  dialect.insert(fname, sfe);
570 
571  xmlReader->next();
572 
573  assert(xmlReader->getNodeType() == te::xml::END_ELEMENT);
574 
575  xmlReader->next();
576  }
577 
578  assert(xmlReader->getNodeType() == te::xml::END_ELEMENT); // SpatialTopologicOperators
579 
580  xmlReader->next();
581  assert(xmlReader->getNodeType() == te::xml::START_ELEMENT);
582  assert(xmlReader->getElementLocalName() == "SpatialMetricOperators");
583 
584  while(xmlReader->next() &&
585  (xmlReader->getNodeType() == te::xml::START_ELEMENT) &&
586  (xmlReader->getElementLocalName() == "Function"))
587  {
588  te::da::SQLFunctionEncoder* sfe = nullptr;
589 
590  std::string fname = xmlReader->getAttr("name");
591 
592  qc.addSpatialMetricOperator(fname);
593 
594  xmlReader->next();
595  assert(xmlReader->getNodeType() == te::xml::START_ELEMENT);
596 
597  std::string encoderType = xmlReader->getElementLocalName();
598 
599  if(encoderType == "FunctionEncoder")
600  {
601  std::string alias = xmlReader->getAttr(0);
602  sfe = new te::da::FunctionEncoder(alias);
603  }
604  else if(encoderType == "BinaryOpEncoder")
605  {
606  std::string alias = xmlReader->getAttr(0);
607  sfe = new te::da::BinaryOpEncoder(alias);
608  }
609  else if(encoderType == "UnaryOpEncoder")
610  {
611  std::string alias = xmlReader->getAttr(0);
612  sfe = new te::da::UnaryOpEncoder(alias);
613  }
614  else if(encoderType == "TemplateEncoder")
615  {
616  std::string alias = xmlReader->getAttr(0);
617  std::string temp = xmlReader->getAttr(1);
618  sfe = new te::da::TemplateEncoder(alias, temp);
619  }
620  else
621  {
622  throw te::da::Exception(TE_TR("Unsupported encoder type!"));
623  }
624 
625  dialect.insert(fname, sfe);
626 
627  xmlReader->next();
628 
629  assert(xmlReader->getNodeType() == te::xml::END_ELEMENT);
630 
631  xmlReader->next();
632  }
633 
634  assert(xmlReader->getNodeType() == te::xml::END_ELEMENT); // SpatialMetricOperators
635 
636  xmlReader->next();
637  assert(xmlReader->getNodeType() == te::xml::START_ELEMENT);
638  assert(xmlReader->getElementLocalName() == "SpatialNewGeomOperators");
639 
640  while(xmlReader->next() &&
641  (xmlReader->getNodeType() == te::xml::START_ELEMENT) &&
642  (xmlReader->getElementLocalName() == "Function"))
643  {
644  te::da::SQLFunctionEncoder* sfe = nullptr;
645 
646  std::string fname = xmlReader->getAttr("name");
647 
648  qc.addSpatialNewGeomOperator(fname);
649 
650  xmlReader->next();
651  assert(xmlReader->getNodeType() == te::xml::START_ELEMENT);
652 
653  std::string encoderType = xmlReader->getElementLocalName();
654 
655  if(encoderType == "FunctionEncoder")
656  {
657  std::string alias = xmlReader->getAttr(0);
658  sfe = new te::da::FunctionEncoder(alias);
659  }
660  else if(encoderType == "BinaryOpEncoder")
661  {
662  std::string alias = xmlReader->getAttr(0);
663  sfe = new te::da::BinaryOpEncoder(alias);
664  }
665  else if(encoderType == "UnaryOpEncoder")
666  {
667  std::string alias = xmlReader->getAttr(0);
668  sfe = new te::da::UnaryOpEncoder(alias);
669  }
670  else if(encoderType == "TemplateEncoder")
671  {
672  std::string alias = xmlReader->getAttr(0);
673  std::string temp = xmlReader->getAttr(1);
674  sfe = new te::da::TemplateEncoder(alias, temp);
675  }
676  else
677  {
678  throw te::da::Exception(TE_TR("Unsupported encoder type!"));
679  }
680 
681  dialect.insert(fname, sfe);
682 
683  xmlReader->next();
684 
685  assert(xmlReader->getNodeType() == te::xml::END_ELEMENT);
686 
687  xmlReader->next();
688  }
689 
690  assert(xmlReader->getNodeType() == te::xml::END_ELEMENT); // SpatialNewGeomOperators
691 
692  //----------------------------
693 
694  xmlReader->next();
695  assert(xmlReader->getNodeType() == te::xml::START_ELEMENT);
696  assert(xmlReader->getElementLocalName() == "SpatialOperators");
697 
698  while(xmlReader->next() &&
699  (xmlReader->getNodeType() == te::xml::START_ELEMENT) &&
700  (xmlReader->getElementLocalName() == "Function"))
701  {
702  te::da::SQLFunctionEncoder* sfe = nullptr;
703 
704  std::string fname = xmlReader->getAttr("name");
705 
706  qc.addSpatialOperator(fname);
707 
708  xmlReader->next();
709  assert(xmlReader->getNodeType() == te::xml::START_ELEMENT);
710 
711  std::string encoderType = xmlReader->getElementLocalName();
712 
713  if(encoderType == "FunctionEncoder")
714  {
715  std::string alias = xmlReader->getAttr(0);
716  sfe = new te::da::FunctionEncoder(alias);
717  }
718  else if(encoderType == "BinaryOpEncoder")
719  {
720  std::string alias = xmlReader->getAttr(0);
721  sfe = new te::da::BinaryOpEncoder(alias);
722  }
723  else if(encoderType == "UnaryOpEncoder")
724  {
725  std::string alias = xmlReader->getAttr(0);
726  sfe = new te::da::UnaryOpEncoder(alias);
727  }
728  else if(encoderType == "TemplateEncoder")
729  {
730  std::string alias = xmlReader->getAttr(0);
731  std::string temp = xmlReader->getAttr(1);
732  sfe = new te::da::TemplateEncoder(alias, temp);
733  }
734  else
735  {
736  throw te::da::Exception(TE_TR("Unsupported encoder type!"));
737  }
738 
739  dialect.insert(fname, sfe);
740 
741  xmlReader->next();
742 
743  assert(xmlReader->getNodeType() == te::xml::END_ELEMENT);
744 
745  xmlReader->next();
746  }
747 
748  assert(xmlReader->getNodeType() == te::xml::END_ELEMENT); // SpatialOperators
749 
750  xmlReader->next();
751  assert(xmlReader->getNodeType() == te::xml::START_ELEMENT);
752  assert(xmlReader->getElementLocalName() == "LogicalOperators");
753 
754  while(xmlReader->next() &&
755  (xmlReader->getNodeType() == te::xml::START_ELEMENT) &&
756  (xmlReader->getElementLocalName() == "Function"))
757  {
758  te::da::SQLFunctionEncoder* sfe = nullptr;
759 
760  std::string fname = xmlReader->getAttr("name");
761 
762  qc.addLogicalOperator(fname);
763 
764  xmlReader->next();
765  assert(xmlReader->getNodeType() == te::xml::START_ELEMENT);
766 
767  std::string encoderType = xmlReader->getElementLocalName();
768 
769  if(encoderType == "FunctionEncoder")
770  {
771  std::string alias = xmlReader->getAttr(0);
772  sfe = new te::da::FunctionEncoder(alias);
773  }
774  else if(encoderType == "BinaryOpEncoder")
775  {
776  std::string alias = xmlReader->getAttr(0);
777  sfe = new te::da::BinaryOpEncoder(alias);
778  }
779  else if(encoderType == "UnaryOpEncoder")
780  {
781  std::string alias = xmlReader->getAttr(0);
782  sfe = new te::da::UnaryOpEncoder(alias);
783  }
784  else if(encoderType == "TemplateEncoder")
785  {
786  std::string alias = xmlReader->getAttr(0);
787  std::string temp = xmlReader->getAttr(1);
788  sfe = new te::da::TemplateEncoder(alias, temp);
789  }
790  else
791  {
792  throw te::da::Exception(TE_TR("Unsupported encoder type!"));
793  }
794 
795  dialect.insert(fname, sfe);
796 
797  xmlReader->next();
798 
799  assert(xmlReader->getNodeType() == te::xml::END_ELEMENT);
800 
801  xmlReader->next();
802  }
803 
804  assert(xmlReader->getNodeType() == te::xml::END_ELEMENT); // LogicalOperators
805 
806  xmlReader->next();
807  assert(xmlReader->getNodeType() == te::xml::START_ELEMENT);
808  assert(xmlReader->getElementLocalName() == "ComparsionOperators");
809 
810  while(xmlReader->next() &&
811  (xmlReader->getNodeType() == te::xml::START_ELEMENT) &&
812  (xmlReader->getElementLocalName() == "Function"))
813  {
814  te::da::SQLFunctionEncoder* sfe = nullptr;
815 
816  std::string fname = xmlReader->getAttr("name");
817 
818  qc.addComparsionOperator(fname);
819 
820  xmlReader->next();
821  assert(xmlReader->getNodeType() == te::xml::START_ELEMENT);
822 
823  std::string encoderType = xmlReader->getElementLocalName();
824 
825  if(encoderType == "FunctionEncoder")
826  {
827  std::string alias = xmlReader->getAttr(0);
828  sfe = new te::da::FunctionEncoder(alias);
829  }
830  else if(encoderType == "BinaryOpEncoder")
831  {
832  std::string alias = xmlReader->getAttr(0);
833  sfe = new te::da::BinaryOpEncoder(alias);
834  }
835  else if(encoderType == "UnaryOpEncoder")
836  {
837  std::string alias = xmlReader->getAttr(0);
838  sfe = new te::da::UnaryOpEncoder(alias);
839  }
840  else if(encoderType == "TemplateEncoder")
841  {
842  std::string alias = xmlReader->getAttr(0);
843  std::string temp = xmlReader->getAttr(1);
844  sfe = new te::da::TemplateEncoder(alias, temp);
845  }
846  else
847  {
848  throw te::da::Exception(TE_TR("Unsupported encoder type!"));
849  }
850 
851  dialect.insert(fname, sfe);
852 
853  xmlReader->next();
854 
855  assert(xmlReader->getNodeType() == te::xml::END_ELEMENT);
856 
857  xmlReader->next();
858  }
859 
860  assert(xmlReader->getNodeType() == te::xml::END_ELEMENT); // ComparsionOperators
861 
862  xmlReader->next();
863  assert(xmlReader->getNodeType() == te::xml::START_ELEMENT);
864  assert(xmlReader->getElementLocalName() == "ArithmeticOperators");
865 
866  while(xmlReader->next() &&
867  (xmlReader->getNodeType() == te::xml::START_ELEMENT) &&
868  (xmlReader->getElementLocalName() == "Function"))
869  {
870  te::da::SQLFunctionEncoder* sfe = nullptr;
871 
872  std::string fname = xmlReader->getAttr("name");
873 
874  qc.addArithmeticOperator(fname);
875 
876  xmlReader->next();
877  assert(xmlReader->getNodeType() == te::xml::START_ELEMENT);
878 
879  std::string encoderType = xmlReader->getElementLocalName();
880 
881  if(encoderType == "FunctionEncoder")
882  {
883  std::string alias = xmlReader->getAttr(0);
884  sfe = new te::da::FunctionEncoder(alias);
885  }
886  else if(encoderType == "BinaryOpEncoder")
887  {
888  std::string alias = xmlReader->getAttr(0);
889  sfe = new te::da::BinaryOpEncoder(alias);
890  }
891  else if(encoderType == "UnaryOpEncoder")
892  {
893  std::string alias = xmlReader->getAttr(0);
894  sfe = new te::da::UnaryOpEncoder(alias);
895  }
896  else if(encoderType == "TemplateEncoder")
897  {
898  std::string alias = xmlReader->getAttr(0);
899  std::string temp = xmlReader->getAttr(1);
900  sfe = new te::da::TemplateEncoder(alias, temp);
901  }
902  else
903  {
904  throw te::da::Exception(TE_TR("Unsupported encoder type!"));
905  }
906 
907  dialect.insert(fname, sfe);
908 
909  xmlReader->next();
910 
911  assert(xmlReader->getNodeType() == te::xml::END_ELEMENT);
912 
913  xmlReader->next();
914  }
915 
916  assert(xmlReader->getNodeType() == te::xml::END_ELEMENT); // ArithmeticOperators
917 
918  xmlReader->next();
919  assert(xmlReader->getNodeType() == te::xml::START_ELEMENT);
920  assert(xmlReader->getElementLocalName() == "Functions");
921 
922  while(xmlReader->next() &&
923  (xmlReader->getNodeType() == te::xml::START_ELEMENT) &&
924  (xmlReader->getElementLocalName() == "Function"))
925  {
926  te::da::SQLFunctionEncoder* sfe = nullptr;
927 
928  std::string fname = xmlReader->getAttr("name");
929 
930  qc.addFunction(fname);
931 
932  xmlReader->next();
933  assert(xmlReader->getNodeType() == te::xml::START_ELEMENT);
934 
935  std::string encoderType = xmlReader->getElementLocalName();
936 
937  if(encoderType == "FunctionEncoder")
938  {
939  std::string alias = xmlReader->getAttr(0);
940  sfe = new te::da::FunctionEncoder(alias);
941  }
942  else if(encoderType == "BinaryOpEncoder")
943  {
944  std::string alias = xmlReader->getAttr(0);
945  sfe = new te::da::BinaryOpEncoder(alias);
946  }
947  else if(encoderType == "UnaryOpEncoder")
948  {
949  std::string alias = xmlReader->getAttr(0);
950  sfe = new te::da::UnaryOpEncoder(alias);
951  }
952  else if(encoderType == "TemplateEncoder")
953  {
954  std::string alias = xmlReader->getAttr(0);
955  std::string temp = xmlReader->getAttr(1);
956  sfe = new te::da::TemplateEncoder(alias, temp);
957  }
958  else
959  {
960  throw te::da::Exception(TE_TR("Unsupported encoder type!"));
961  }
962 
963  dialect.insert(fname, sfe);
964 
965  xmlReader->next();
966 
967  assert(xmlReader->getNodeType() == te::xml::END_ELEMENT);
968 
969  xmlReader->next();
970  }
971 
972  assert(xmlReader->getNodeType() == te::xml::END_ELEMENT); // Functions
973 
974  xmlReader->next();
975  assert(xmlReader->getNodeType() == te::xml::START_ELEMENT);
976  assert(xmlReader->getElementLocalName() == "GeomOperands");
977 
978  while(xmlReader->next() &&
979  (xmlReader->getNodeType() == te::xml::START_ELEMENT) &&
980  (xmlReader->getElementLocalName() == "GeomType"))
981  {
982  xmlReader->next();
983  assert(xmlReader->getNodeType() == te::xml::VALUE);
984 
985  std::string geom = boost::to_upper_copy(xmlReader->getElementValue());
986 
987  qc.addGeometryOperand(te::gm::Geometry::getGeomTypeId(geom));
988 
989  xmlReader->next();
990 
991  assert(xmlReader->getNodeType() == te::xml::END_ELEMENT);
992  }
993 
994  assert(xmlReader->getNodeType() == te::xml::END_ELEMENT); // GeomOperands
995 
996  xmlReader->next();
997 
998  assert(xmlReader->getNodeType() == te::xml::END_ELEMENT); // QueryCapabilities
999 
1000  capabilities.setQueryCapabilities(qc);
1001 
1002  xmlReader->next();
1003  assert(xmlReader->getNodeType() == te::xml::START_ELEMENT);
1004  assert(xmlReader->getElementLocalName() == "DataSetTypeCapabilities");
1005 
1007 
1008  xmlReader->next();
1009  assert(xmlReader->getNodeType() == te::xml::START_ELEMENT);
1010  assert(xmlReader->getElementLocalName() == "SupportPrimaryKey");
1011 
1012  xmlReader->next();
1013  assert(xmlReader->getNodeType() == te::xml::VALUE);
1014 
1015  dstc.setSupportPrimaryKey(xmlReader->getElementValueAsBoolean());
1016 
1017  xmlReader->next();
1018  assert(xmlReader->getNodeType() == te::xml::END_ELEMENT); // SupportPrimaryKey
1019 
1020  xmlReader->next();
1021  assert(xmlReader->getNodeType() == te::xml::START_ELEMENT);
1022  assert(xmlReader->getElementLocalName() == "SupportUniqueKey");
1023 
1024  xmlReader->next();
1025  assert(xmlReader->getNodeType() == te::xml::VALUE);
1026 
1027  dstc.setSupportUniqueKey(xmlReader->getElementValueAsBoolean());
1028 
1029  xmlReader->next();
1030  assert(xmlReader->getNodeType() == te::xml::END_ELEMENT); // SupportUniqueKey
1031 
1032  xmlReader->next();
1033  assert(xmlReader->getNodeType() == te::xml::START_ELEMENT);
1034  assert(xmlReader->getElementLocalName() == "SupportForeignKey");
1035 
1036  xmlReader->next();
1037  assert(xmlReader->getNodeType() == te::xml::VALUE);
1038 
1039  dstc.setSupportForeingKey(xmlReader->getElementValueAsBoolean());
1040 
1041  xmlReader->next();
1042  assert(xmlReader->getNodeType() == te::xml::END_ELEMENT); // SupportForeignKey
1043 
1044  xmlReader->next();
1045  assert(xmlReader->getNodeType() == te::xml::START_ELEMENT);
1046  assert(xmlReader->getElementLocalName() == "SupportSequence");
1047 
1048  xmlReader->next();
1049  assert(xmlReader->getNodeType() == te::xml::VALUE);
1050 
1051  dstc.setSupportSequence(xmlReader->getElementValueAsBoolean());
1052 
1053  xmlReader->next();
1054  assert(xmlReader->getNodeType() == te::xml::END_ELEMENT); // SupportSequence
1055 
1056  xmlReader->next();
1057  assert(xmlReader->getNodeType() == te::xml::START_ELEMENT);
1058  assert(xmlReader->getElementLocalName() == "SupportCheckConstraints");
1059 
1060  xmlReader->next();
1061  assert(xmlReader->getNodeType() == te::xml::VALUE);
1062 
1063  dstc.setSupportCheckConstraints(xmlReader->getElementValueAsBoolean());
1064 
1065  xmlReader->next();
1066  assert(xmlReader->getNodeType() == te::xml::END_ELEMENT); // SupportCheckConstraints
1067 
1068  xmlReader->next();
1069  assert(xmlReader->getNodeType() == te::xml::START_ELEMENT);
1070  assert(xmlReader->getElementLocalName() == "SupportIndex");
1071 
1072  xmlReader->next();
1073  assert(xmlReader->getNodeType() == te::xml::VALUE);
1074 
1075  dstc.setSupportIndex(xmlReader->getElementValueAsBoolean());
1076 
1077  xmlReader->next();
1078  assert(xmlReader->getNodeType() == te::xml::END_ELEMENT); // SupportIndex
1079 
1080  xmlReader->next();
1081  assert(xmlReader->getNodeType() == te::xml::START_ELEMENT);
1082  assert(xmlReader->getElementLocalName() == "SupportRTreeIndex");
1083 
1084  xmlReader->next();
1085  assert(xmlReader->getNodeType() == te::xml::VALUE);
1086 
1087  dstc.setSupportRTreeIndex(xmlReader->getElementValueAsBoolean());
1088 
1089  xmlReader->next();
1090  assert(xmlReader->getNodeType() == te::xml::END_ELEMENT); // SupportRTreeIndex
1091 
1092  xmlReader->next();
1093  assert(xmlReader->getNodeType() == te::xml::START_ELEMENT);
1094  assert(xmlReader->getElementLocalName() == "SupportBTreeIndex");
1095 
1096  xmlReader->next();
1097  assert(xmlReader->getNodeType() == te::xml::VALUE);
1098 
1099  dstc.setSupportBTreeIndex(xmlReader->getElementValueAsBoolean());
1100 
1101  xmlReader->next();
1102  assert(xmlReader->getNodeType() == te::xml::END_ELEMENT); // SupportBTreeIndex
1103 
1104  xmlReader->next();
1105  assert(xmlReader->getNodeType() == te::xml::START_ELEMENT);
1106  assert(xmlReader->getElementLocalName() == "SupportHashIndex");
1107 
1108  xmlReader->next();
1109  assert(xmlReader->getNodeType() == te::xml::VALUE);
1110 
1111  dstc.setSupportHashIndex(xmlReader->getElementValueAsBoolean());
1112 
1113  xmlReader->next();
1114  assert(xmlReader->getNodeType() == te::xml::END_ELEMENT); // SupportHashIndex
1115 
1116  xmlReader->next();
1117  assert(xmlReader->getNodeType() == te::xml::START_ELEMENT);
1118  assert(xmlReader->getElementLocalName() == "SupportQuadTreeIndex");
1119 
1120  xmlReader->next();
1121  assert(xmlReader->getNodeType() == te::xml::VALUE);
1122 
1123  dstc.setSupportQuadTreeIndex(xmlReader->getElementValueAsBoolean());
1124 
1125  xmlReader->next();
1126  assert(xmlReader->getNodeType() == te::xml::END_ELEMENT); // SupportQuadTreeIndex
1127 
1128  xmlReader->next();
1129  assert(xmlReader->getNodeType() == te::xml::END_ELEMENT); // DataSetTypeCapabilities
1130 
1131  capabilities.setDataSetTypeCapabilities(dstc);
1132 
1133  xmlReader->next();
1134  assert(xmlReader->getNodeType() == te::xml::START_ELEMENT);
1135  assert(xmlReader->getElementLocalName() == "DataSetCapabilities");
1136 
1138 
1139  xmlReader->next();
1140  assert(xmlReader->getNodeType() == te::xml::START_ELEMENT);
1141  assert(xmlReader->getElementLocalName() == "Bidirectional");
1142 
1143  xmlReader->next();
1144  assert(xmlReader->getNodeType() == te::xml::VALUE);
1145 
1146  dsetc.setSupportBidirectionalTraversing(xmlReader->getElementValueAsBoolean());
1147 
1148  xmlReader->next();
1149  assert(xmlReader->getNodeType() == te::xml::END_ELEMENT); // Bidirectional
1150 
1151  xmlReader->next();
1152  assert(xmlReader->getNodeType() == te::xml::START_ELEMENT);
1153  assert(xmlReader->getElementLocalName() == "Random");
1154 
1155  xmlReader->next();
1156  assert(xmlReader->getNodeType() == te::xml::VALUE);
1157 
1158  dsetc.setSupportRandomTraversing(xmlReader->getElementValueAsBoolean());
1159 
1160  xmlReader->next();
1161  assert(xmlReader->getNodeType() == te::xml::END_ELEMENT); // Random
1162 
1163  xmlReader->next();
1164  assert(xmlReader->getNodeType() == te::xml::START_ELEMENT);
1165  assert(xmlReader->getElementLocalName() == "Indexed");
1166 
1167  xmlReader->next();
1168  assert(xmlReader->getNodeType() == te::xml::VALUE);
1169 
1170  dsetc.setSupportIndexedTraversing(xmlReader->getElementValueAsBoolean());
1171 
1172  xmlReader->next();
1173  assert(xmlReader->getNodeType() == te::xml::END_ELEMENT); // Indexed
1174 
1175  xmlReader->next();
1176  assert(xmlReader->getNodeType() == te::xml::START_ELEMENT);
1177  assert(xmlReader->getElementLocalName() == "EfficientMovePrevious");
1178 
1179  xmlReader->next();
1180  assert(xmlReader->getNodeType() == te::xml::VALUE);
1181 
1182  dsetc.setSupportEfficientMovePrevious(xmlReader->getElementValueAsBoolean());
1183 
1184  xmlReader->next();
1185  assert(xmlReader->getNodeType() == te::xml::END_ELEMENT); // EfficientMovePrevious
1186 
1187  xmlReader->next();
1188  assert(xmlReader->getNodeType() == te::xml::START_ELEMENT);
1189  assert(xmlReader->getElementLocalName() == "EfficientMoveBeforeFirst");
1190 
1191  xmlReader->next();
1192  assert(xmlReader->getNodeType() == te::xml::VALUE);
1193 
1194  dsetc.setSupportEfficientMoveBeforeFirst(xmlReader->getElementValueAsBoolean());
1195 
1196  xmlReader->next();
1197  assert(xmlReader->getNodeType() == te::xml::END_ELEMENT); // EfficientMoveBeforeFirst
1198 
1199  xmlReader->next();
1200  assert(xmlReader->getNodeType() == te::xml::START_ELEMENT);
1201  assert(xmlReader->getElementLocalName() == "EfficientMoveLast");
1202 
1203  xmlReader->next();
1204  assert(xmlReader->getNodeType() == te::xml::VALUE);
1205 
1206  dsetc.setSupportEfficientMoveLast(xmlReader->getElementValueAsBoolean());
1207 
1208  xmlReader->next();
1209  assert(xmlReader->getNodeType() == te::xml::END_ELEMENT); // EfficientMoveLast
1210 
1211  xmlReader->next();
1212  assert(xmlReader->getNodeType() == te::xml::START_ELEMENT);
1213  assert(xmlReader->getElementLocalName() == "EfficientMoveAfterLast");
1214 
1215  xmlReader->next();
1216  assert(xmlReader->getNodeType() == te::xml::VALUE);
1217 
1218  dsetc.setSupportEfficientMoveAfterLast(xmlReader->getElementValueAsBoolean());
1219 
1220  xmlReader->next();
1221  assert(xmlReader->getNodeType() == te::xml::END_ELEMENT); // EfficientMoveAfterLast
1222 
1223  xmlReader->next();
1224  assert(xmlReader->getNodeType() == te::xml::START_ELEMENT);
1225  assert(xmlReader->getElementLocalName() == "EfficientMove");
1226 
1227  xmlReader->next();
1228  assert(xmlReader->getNodeType() == te::xml::VALUE);
1229 
1230  dsetc.setSupportEfficientMove(xmlReader->getElementValueAsBoolean());
1231 
1232  xmlReader->next();
1233  assert(xmlReader->getNodeType() == te::xml::END_ELEMENT); // EfficientMove
1234 
1235  xmlReader->next();
1236  assert(xmlReader->getNodeType() == te::xml::START_ELEMENT);
1237  assert(xmlReader->getElementLocalName() == "EfficientSize");
1238 
1239  xmlReader->next();
1240  assert(xmlReader->getNodeType() == te::xml::VALUE);
1241 
1242  dsetc.setSupportEfficientDataSetSize(xmlReader->getElementValueAsBoolean());
1243 
1244  xmlReader->next();
1245  assert(xmlReader->getNodeType() == te::xml::END_ELEMENT); // EfficientSize
1246 
1247  xmlReader->next();
1248  assert(xmlReader->getNodeType() == te::xml::START_ELEMENT);
1249  assert(xmlReader->getElementLocalName() == "IsConnected");
1250 
1251  xmlReader->next();
1252  assert(xmlReader->getNodeType() == te::xml::VALUE);
1253 
1254  dsetc.setAsConnected(xmlReader->getElementValueAsBoolean());
1255 
1256  xmlReader->next();
1257  assert(xmlReader->getNodeType() == te::xml::END_ELEMENT); // IsConnected
1258 
1259  xmlReader->next();
1260  assert(xmlReader->getNodeType() == te::xml::END_ELEMENT); // DataSetCapabilities
1261 
1262  capabilities.setDataSetCapabilities(dsetc);
1263 
1264  xmlReader->next();
1265  assert(xmlReader->getNodeType() == te::xml::START_ELEMENT);
1266  assert(xmlReader->getElementLocalName() == "SpecificCapabilities");
1267 
1268  while(xmlReader->next() &&
1269  (xmlReader->getNodeType() == te::xml::START_ELEMENT) &&
1270  (xmlReader->getElementLocalName() == "Parameter"))
1271  {
1272  xmlReader->next();
1273  assert(xmlReader->getNodeType() == te::xml::START_ELEMENT);
1274  assert(xmlReader->getElementLocalName() == "Name");
1275 
1276  xmlReader->next();
1277  assert(xmlReader->getNodeType() == te::xml::VALUE);
1278 
1279  std::string paramName = xmlReader->getElementValue();
1280 
1281  xmlReader->next();
1282  assert(xmlReader->getNodeType() == te::xml::END_ELEMENT); // Name
1283 
1284  xmlReader->next();
1285  assert(xmlReader->getNodeType() == te::xml::START_ELEMENT);
1286  assert(xmlReader->getElementLocalName() == "Value");
1287 
1288  xmlReader->next();
1289  assert(xmlReader->getNodeType() == te::xml::VALUE);
1290 
1291  std::string paramValue = xmlReader->getElementValue();
1292 
1293  xmlReader->next();
1294  assert(xmlReader->getNodeType() == te::xml::END_ELEMENT); // Value
1295 
1296  capabilities.addSpecificCapability(paramName, paramValue);
1297 
1298  xmlReader->next();
1299  assert(xmlReader->getNodeType() == te::xml::END_ELEMENT); // Parameter
1300  }
1301 
1302  assert(xmlReader->getNodeType() == te::xml::END_ELEMENT); // SpecificCapabilities
1303 
1304  xmlReader->next();
1305  assert(xmlReader->getNodeType() == te::xml::START_ELEMENT);
1306  assert(xmlReader->getElementLocalName() == "AccessPolicyName");
1307 
1308  xmlReader->next();
1309  assert(xmlReader->getNodeType() == te::xml::VALUE);
1310 
1311  capabilities.setAccessPolicy(Convert2Terralib(xmlReader->getElementValue()));
1312 
1313  xmlReader->next();
1314  assert(xmlReader->getNodeType() == te::xml::END_ELEMENT); // AccessPolicyName
1315 
1316  xmlReader->next();
1317  assert(xmlReader->getNodeType() == te::xml::START_ELEMENT);
1318  assert(xmlReader->getElementLocalName() == "SupportTransactions");
1319 
1320  xmlReader->next();
1321  assert(xmlReader->getNodeType() == te::xml::VALUE);
1322 
1323  capabilities.setSupportTransactions(xmlReader->getElementValueAsBoolean());
1324 
1325  xmlReader->next();
1326  assert(xmlReader->getNodeType() == te::xml::END_ELEMENT); // SupportTransactions
1327 
1328  xmlReader->next();
1329  assert(xmlReader->getNodeType() == te::xml::START_ELEMENT);
1330  assert(xmlReader->getElementLocalName() == "SupportDataSetPesistenceAPI");
1331 
1332  xmlReader->next();
1333  assert(xmlReader->getNodeType() == te::xml::VALUE);
1334 
1335  capabilities.setSupportDataSetPesistenceAPI(xmlReader->getElementValueAsBoolean());
1336 
1337  xmlReader->next();
1338  assert(xmlReader->getNodeType() == te::xml::END_ELEMENT); // SupportDataSetPesistenceAPI
1339 
1340  xmlReader->next();
1341  assert(xmlReader->getNodeType() == te::xml::START_ELEMENT);
1342  assert(xmlReader->getElementLocalName() == "SupportDataSetTypePesistenceAPI");
1343 
1344  xmlReader->next();
1345  assert(xmlReader->getNodeType() == te::xml::VALUE);
1346 
1347  capabilities.setSupportDataSetTypePesistenceAPI(xmlReader->getElementValueAsBoolean());
1348 
1349  xmlReader->next();
1350  assert(xmlReader->getNodeType() == te::xml::END_ELEMENT); // SupportDataSetTypePesistenceAPI
1351 
1352  xmlReader->next();
1353  assert(xmlReader->getNodeType() == te::xml::START_ELEMENT);
1354  assert(xmlReader->getElementLocalName() == "SupportPreparedQueryAPI");
1355 
1356  xmlReader->next();
1357  assert(xmlReader->getNodeType() == te::xml::VALUE);
1358 
1359  capabilities.setSupportPreparedQueryAPI(xmlReader->getElementValueAsBoolean());
1360 
1361  xmlReader->next();
1362  assert(xmlReader->getNodeType() == te::xml::END_ELEMENT); // SupportPreparedQueryAPI
1363 
1364  xmlReader->next();
1365  assert(xmlReader->getNodeType() == te::xml::START_ELEMENT);
1366  assert(xmlReader->getElementLocalName() == "SupportBatchExecutorAPI");
1367 
1368  xmlReader->next();
1369  assert(xmlReader->getNodeType() == te::xml::VALUE);
1370 
1371  capabilities.setSupportBatchExecutorAPI(xmlReader->getElementValueAsBoolean());
1372 
1373  xmlReader->next();
1374  assert(xmlReader->getNodeType() == te::xml::END_ELEMENT); // SupportBatchExecutorAPI
1375 
1376  xmlReader->next();
1377 
1378  assert(xmlReader->getNodeType() == te::xml::END_DOCUMENT); // DataSourceCapabilities
1379 }
1380 
1381 te::da::SQLDialect* te::serialize::xml::ReadDialect(const std::string& dialectFileName)
1382 {
1383  std::unique_ptr<te::xml::Reader> xmlReader(te::xml::ReaderFactory::make());
1384 
1385  xmlReader->read(dialectFileName);
1386 
1387  if(!xmlReader->next())
1388  throw te::da::Exception((boost::format(TE_TR("Could not read query dialect information in file: %1%.")) % dialectFileName).str());
1389 
1390  if(xmlReader->getNodeType() != te::xml::START_ELEMENT)
1391  throw te::da::Exception((boost::format(TE_TR("Error reading the document %1%, the start element wasn't found.")) % dialectFileName).str());
1392 
1393  if(xmlReader->getElementLocalName() != "QueryDialect")
1394  throw te::da::Exception((boost::format(TE_TR("The first tag in the document %1% is not 'QueryDialect'.")) % dialectFileName).str());
1395 
1396  xmlReader->next();
1397  assert(xmlReader->getNodeType() == te::xml::START_ELEMENT);
1398  assert(xmlReader->getElementLocalName() == "DriverName");
1399 
1400  xmlReader->next();
1401  assert(xmlReader->getNodeType() == te::xml::VALUE);
1402  xmlReader->next();
1403  assert(xmlReader->getNodeType() == te::xml::END_ELEMENT);
1404 
1405  xmlReader->next();
1406  assert(xmlReader->getNodeType() == te::xml::START_ELEMENT);
1407  assert(xmlReader->getElementLocalName() == "Functions");
1408 
1409  std::unique_ptr<te::da::SQLDialect> mydialect(new te::da::SQLDialect);
1410 
1411  while(xmlReader->next() &&
1412  (xmlReader->getNodeType() == te::xml::START_ELEMENT) &&
1413  (xmlReader->getElementLocalName() == "Function"))
1414  {
1415  std::string fname = xmlReader->getAttr(0);
1416 
1417  xmlReader->next();
1418  assert(xmlReader->getNodeType() == te::xml::START_ELEMENT);
1419 
1420  std::string encoderType = xmlReader->getElementLocalName();
1421 
1422  te::da::SQLFunctionEncoder* sfe = nullptr;
1423 
1424  if(encoderType == "FunctionEncoder")
1425  {
1426  std::string alias = xmlReader->getAttr(0);
1427  sfe = new te::da::FunctionEncoder(alias);
1428  }
1429  else if(encoderType == "BinaryOpEncoder")
1430  {
1431  std::string alias = xmlReader->getAttr(0);
1432  sfe = new te::da::BinaryOpEncoder(alias);
1433  }
1434  else if(encoderType == "UnaryOpEncoder")
1435  {
1436  std::string alias = xmlReader->getAttr(0);
1437  sfe = new te::da::UnaryOpEncoder(alias);
1438  }
1439  else
1440  {
1441  throw te::da::Exception(TE_TR("Unsupported encoder type!"));
1442  }
1443 
1444  xmlReader->next();
1445  assert(xmlReader->getNodeType() == te::xml::END_ELEMENT); // End of Encoder
1446 
1447  mydialect->insert(fname, sfe);
1448 
1449  xmlReader->next();
1450  assert(xmlReader->getNodeType() == te::xml::END_ELEMENT); // End of Function
1451  }
1452 
1453  assert(xmlReader->getNodeType() == te::xml::END_DOCUMENT); // End of QueryDialect
1454 
1455  return mydialect.release();
1456 }
1457 
1459 {
1460  assert(reader.getNodeType() == te::xml::START_ELEMENT);
1461  assert(reader.getElementLocalName() == "Distinct");
1462 
1463  reader.next();
1464 
1465  te::da::Distinct* dist = new te::da::Distinct;
1466 
1467  while(reader.getNodeType() == te::xml::START_ELEMENT)
1468  {
1469  te::da::Expression* exp = nullptr;
1470 
1471  if(reader.getElementLocalName() == "PropertyName")
1472  {
1473  exp = ReadPropertyName(reader);
1474  }
1475  else if(reader.getElementLocalName() == "Literal")
1476  {
1477  exp = ReadLiteral(reader);
1478  }
1479  else if(reader.getElementLocalName() == "Function")
1480  {
1481  exp = ReadFunction(reader);
1482  }
1483 
1484  dist->push_back(exp);
1485  }
1486 
1487  assert(reader.getNodeType() == te::xml::END_ELEMENT); // Distinct
1488 
1489  reader.next();
1490 
1491  return dist;
1492 }
1493 
1495 {
1496  assert(reader.getNodeType() == te::xml::START_ELEMENT);
1497  assert(reader.getElementLocalName() == "Fields");
1498 
1499  reader.next();
1500 
1501  te::da::Fields* fields = new te::da::Fields;
1502 
1503  while(reader.getNodeType() == te::xml::START_ELEMENT)
1504  {
1505  te::da::Field* f = nullptr;
1506  assert(reader.getElementLocalName() == "Field");
1507  reader.next();
1508  assert(reader.getNodeType() == te::xml::START_ELEMENT);
1509 
1510  if(reader.getElementLocalName() == "PropertyName")
1511  {
1512  f = new te::da::Field(ReadPropertyName(reader));
1513  fields->push_back(f);
1514  }
1515 
1516  else if(reader.getElementLocalName() == "Function")
1517  {
1518  f = new te::da::Field(ReadFunction(reader));
1519  fields->push_back(f);
1520  }
1521  else if(reader.getElementLocalName() == "Literal")
1522  {
1523  f = new te::da::Field(ReadLiteral(reader));
1524  fields->push_back(f);
1525  }
1526  if (f != nullptr)
1527  {
1528  if (reader.getNodeType() == te::xml::START_ELEMENT)
1529  {
1530  if (reader.getElementLocalName() == "Alias")
1531  {
1532  reader.next();
1533  assert(reader.getNodeType() == te::xml::VALUE);
1534  f->setAlias(new std::string(reader.getElementValue()));
1535  reader.next();
1536  assert(reader.getNodeType() == te::xml::END_ELEMENT); // Alias
1537  reader.next();
1538  }
1539  }
1540  }
1541 
1542  assert(reader.getNodeType() == te::xml::END_ELEMENT); // Field
1543 
1544  reader.next();
1545  }
1546 
1547  assert(reader.getNodeType() == te::xml::END_ELEMENT); // Fields
1548 
1549  reader.next();
1550 
1551  return fields;
1552 }
1553 
1555 {
1556  assert(reader.getNodeType() == te::xml::START_ELEMENT);
1557  assert(reader.getElementLocalName() == "From");
1558 
1559  reader.next();
1560 
1561  te::da::From* from = new te::da::From;
1562 
1563  while(reader.getNodeType() == te::xml::START_ELEMENT)
1564  {
1565  if(reader.getElementLocalName() == "FromItem")
1566  {
1567  from->push_back(ReadFromItem(reader));
1568  }
1569  else if(reader.getElementLocalName() == "JoinItem")
1570  {
1571  reader.next();
1572 
1573  te::da::FromItem* first = ReadFromItem(reader);
1574  te::da::FromItem* second = ReadFromItem(reader);
1575 
1576  assert(reader.getNodeType() == te::xml::START_ELEMENT);
1577  assert(reader.getElementLocalName() == "Type");
1578 
1579  reader.next();
1580 
1581  assert(reader.getNodeType() == te::xml::VALUE);
1582 
1583  std::string type = reader.getElementValue();
1584 
1585  reader.next();
1586 
1587  te::da::JoinType joinType = te::da::JOIN;
1588 
1589  if(type == "JOIN")
1590  joinType = te::da::JOIN;
1591  else if (type == "INNER_JOIN")
1592  joinType = te::da::INNER_JOIN;
1593  else if (type == "LEFT_JOIN")
1594  joinType = te::da::LEFT_JOIN;
1595  else if (type == "RIGHT_JOIN")
1596  joinType = te::da::RIGHT_JOIN;
1597  else if (type == "FULL_OUTER_JOIN")
1598  joinType = te::da::FULL_OUTER_JOIN;
1599  else if ( type == "CROSS_JOIN")
1600  joinType = te::da::CROSS_JOIN;
1601  else
1602  joinType = te::da::NATURAL_JOIN;
1603 
1604  assert(reader.getNodeType() == te::xml::END_ELEMENT); // Type
1605 
1606  reader.next();
1607 
1608  assert(reader.getNodeType() == te::xml::START_ELEMENT);
1609  assert(reader.getElementLocalName() == "Condition");
1610 
1611  reader.next();
1612  te::da::JoinCondition* JoinCondition = nullptr;
1613  assert(reader.getNodeType() == te::xml::START_ELEMENT);
1614 
1615  if(reader.getElementLocalName() == "JoinConditionOn")
1616  {
1617  reader.next();
1618  JoinCondition = new te::da::JoinConditionOn(ReadFunction(reader));
1619  assert(reader.getNodeType() == te::xml::END_ELEMENT); // JoinConditionOn
1620  }
1621  else if(reader.getElementLocalName() == "JoinConditionUsing")
1622  {
1623  reader.next();
1624  while(reader.getNodeType() == te::xml::START_ELEMENT && reader.getElementLocalName() == "PropertyName")
1625  {
1626  JoinCondition = new te::da::JoinConditionUsing();
1627  dynamic_cast<te::da::JoinConditionUsing*>(JoinCondition)->push_back(ReadPropertyName(reader));
1628  }
1629  assert(reader.getNodeType() == te::xml::END_ELEMENT); // JoinConditionUsing
1630  }
1631 
1632  reader.next();
1633  assert(reader.getNodeType() == te::xml::END_ELEMENT); // Condition
1634 
1635  te::da::Join* join = new te::da::Join(first, second, joinType, JoinCondition);
1636  from->push_back(join);
1637 
1638  reader.next();
1639  assert(reader.getNodeType() == te::xml::END_ELEMENT); // JoinItem
1640  reader.next();
1641  }
1642  }
1643 
1644  assert(reader.getNodeType() == te::xml::END_ELEMENT); // From
1645  reader.next();
1646 
1647  return from;
1648 }
1649 
1651 {
1652  assert(reader.getNodeType() == te::xml::START_ELEMENT);
1653  assert(reader.getElementLocalName() == "FromItem");
1654 
1655  reader.next();
1656 
1657  assert(reader.getNodeType() == te::xml::START_ELEMENT);
1658  assert(reader.getElementLocalName() == "Value");
1659 
1660  reader.next();
1661 
1662  assert(reader.getNodeType() == te::xml::VALUE);
1663 
1664  std::string name = reader.getElementValue();
1665 
1666  reader.next();
1667 
1668  assert(reader.getNodeType() == te::xml::END_ELEMENT);
1669 
1670  reader.next();
1671 
1672  assert(reader.getNodeType() == te::xml::START_ELEMENT);
1673  assert(reader.getElementLocalName() == "Alias");
1674 
1675  reader.next();
1676 
1677  assert(reader.getNodeType() == te::xml::VALUE);
1678 
1679  std::string alias = reader.getElementValue();
1680 
1681  reader.next();
1682 
1683  assert(reader.getNodeType() == te::xml::END_ELEMENT);
1684 
1685  reader.next();
1686 
1687  assert(reader.getNodeType() == te::xml::END_ELEMENT); // FromItem
1688 
1689  reader.next();
1690 
1691  return new te::da::DataSetName(name, alias);
1692 }
1693 
1695 {
1696  assert(reader.getNodeType() == te::xml::START_ELEMENT);
1697  assert(reader.getElementLocalName() == "Function");
1698 
1699  reader.next();
1700 
1701  assert(reader.getNodeType() == te::xml::START_ELEMENT);
1702  assert(reader.getElementLocalName() == "Name");
1703 
1704  reader.next();
1705 
1706  assert(reader.getNodeType() == te::xml::VALUE);
1707 
1708  std::string name = reader.getElementValue();
1709 
1710  reader.next();
1711 
1712  assert(reader.getNodeType() == te::xml::END_ELEMENT);
1713 
1714  reader.next();
1715 
1716  te::da::Expression* exp1 = nullptr;
1717  te::da::Expression* exp2 = nullptr;
1718 
1719  std::size_t countAux = 0;
1720  assert(reader.getNodeType() == te::xml::START_ELEMENT);
1721  while(reader.getNodeType() == te::xml::START_ELEMENT)
1722  {
1723  te::da::Expression* exp = nullptr;
1724 
1725  if(reader.getElementLocalName() == "PropertyName")
1726  {
1727  exp = ReadPropertyName(reader);
1728  }
1729  else if(reader.getElementLocalName() == "Literal")
1730  {
1731  exp = ReadLiteral(reader);
1732  }
1733  else if(reader.getElementLocalName() == "Function")
1734  {
1735  exp = ReadFunction(reader);
1736  }
1737 
1738  if(countAux == 0)
1739  exp1 = exp;
1740  else
1741  exp2 = exp;
1742 
1743  ++countAux;
1744  }
1745 
1746  assert(reader.getNodeType() == te::xml::END_ELEMENT); // Function
1747 
1748  te::da::BinaryFunction* func = new te::da::BinaryFunction(name, exp1, exp2);
1749 
1750  reader.next();
1751 
1752  return func;
1753 }
1754 
1756 {
1757  assert(reader.getNodeType() == te::xml::START_ELEMENT);
1758  assert(reader.getElementLocalName() == "GroupBy");
1759 
1760  reader.next();
1761 
1762  te::da::GroupBy* groupBy = new te::da::GroupBy;
1763 
1764  while(reader.getNodeType() == te::xml::START_ELEMENT)
1765  {
1766  assert(reader.getElementLocalName() == "GroupByItem");
1767 
1768  reader.next();
1769 
1770  te::da::Expression* exp = nullptr;
1771 
1772  if(reader.getElementLocalName() == "PropertyName")
1773  {
1774  exp = ReadPropertyName(reader);
1775  }
1776  else if(reader.getElementLocalName() == "Literal")
1777  {
1778  exp = ReadLiteral(reader);
1779  }
1780  else if(reader.getElementLocalName() == "Function")
1781  {
1782  exp = ReadFunction(reader);
1783  }
1784 
1785  te::da::GroupByItem* groupByItem = new te::da::GroupByItem(exp);
1786 
1787  groupBy->push_back(groupByItem);
1788 
1789  assert(reader.getNodeType() == te::xml::END_ELEMENT); //GroupByItem
1790 
1791  reader.next();
1792  }
1793 
1794  assert(reader.getNodeType() == te::xml::END_ELEMENT); // GroupBy
1795 
1796  reader.next();
1797 
1798  return groupBy;
1799 }
1800 
1802 {
1803  assert(reader.getNodeType() == te::xml::START_ELEMENT);
1804  assert(reader.getElementLocalName() == "Having");
1805 
1806  reader.next();
1807 
1808  te::da::Expression* exp = nullptr;
1809 
1810  if(reader.getElementLocalName() == "PropertyName")
1811  {
1812  exp = ReadPropertyName(reader);
1813  }
1814  else if(reader.getElementLocalName() == "Literal")
1815  {
1816  exp = ReadLiteral(reader);
1817  }
1818  else if(reader.getElementLocalName() == "Function")
1819  {
1820  exp = ReadFunction(reader);
1821  }
1822 
1823  assert(reader.getNodeType() == te::xml::END_ELEMENT); //Having
1824 
1825  reader.next();
1826 
1827  return new te::da::Having(exp);
1828 }
1829 
1831 {
1832  assert(reader.getNodeType() == te::xml::START_ELEMENT);
1833  assert(reader.getElementLocalName() == "Literal");
1834 
1835  std::size_t litType = reader.getAttrAsInt32("type");
1836 
1837  reader.next();
1838 
1839  assert(reader.getNodeType() == te::xml::VALUE);
1840 
1841  std::string value = reader.getElementValue();
1842 
1843  reader.next();
1844 
1845  assert(reader.getNodeType() == te::xml::END_ELEMENT); // Literal
1846 
1847  reader.next();
1848 
1849  te::da::Literal* lit = nullptr;
1850 
1851  // TODO: Others data type
1852  switch(litType)
1853  {
1854  case te::dt::STRING_TYPE:
1855  {
1856  lit = new te::da::LiteralString(value);
1857  break;
1858  }
1859  case te::dt::INT16_TYPE:
1860  {
1861  lit = new te::da::LiteralInt16(boost::lexical_cast<int16_t>(value));
1862  break;
1863  }
1864  case te::dt::INT32_TYPE:
1865  {
1866  lit = new te::da::LiteralInt32(boost::lexical_cast<int32_t>(value));
1867  break;
1868  }
1869  case te::dt::INT64_TYPE:
1870  {
1871  lit = new te::da::LiteralInt64(boost::lexical_cast<int64_t>(value));
1872  break;
1873  }
1874  case te::dt::DOUBLE_TYPE:
1875  {
1876  lit = new te::da::LiteralDouble(boost::lexical_cast<double>(value));
1877  break;
1878  }
1879  case te::dt::GEOMETRY_TYPE:
1880  {
1881  std::unique_ptr<te::gm::Geometry> geom(te::gm::WKTReader::read(value.c_str()));
1882 
1883  lit = new te::da::LiteralGeom(geom.release());
1884  break;
1885  }
1886  default:
1887  throw te::da::Exception(TE_TR("Data Type Undefined!"));
1888 
1889  }
1890 
1891  return lit;
1892 }
1893 
1895 {
1896  assert(reader.getNodeType() == te::xml::START_ELEMENT);
1897  assert(reader.getElementLocalName() == "OrderBy");
1898 
1899  reader.next();
1900 
1901  te::da::OrderBy* orderBy = new te::da::OrderBy;
1902 
1903  while(reader.getNodeType() == te::xml::START_ELEMENT)
1904  {
1905  assert(reader.getElementLocalName() == "OrderByItem");
1906 
1907  reader.next();
1908 
1909  te::da::Expression* exp = nullptr;
1910 
1911  if(reader.getElementLocalName() == "PropertyName")
1912  {
1913  exp = ReadPropertyName(reader);
1914  }
1915  else if(reader.getElementLocalName() == "Literal")
1916  {
1917  exp = ReadLiteral(reader);
1918  }
1919  else if(reader.getElementLocalName() == "Function")
1920  {
1921  exp = ReadFunction(reader);
1922  }
1923 
1924  assert(reader.getNodeType() == te::xml::START_ELEMENT);
1925 
1926  assert(reader.getElementLocalName() == "SortOrder");
1927 
1928  reader.next();
1929 
1930  assert(reader.getNodeType() == te::xml::VALUE);
1931 
1932  std::string sortOrder = reader.getElementValue();
1933 
1934  te::da::SortOrder order = sortOrder == "ASC" ? te::da::ASC : te::da::DESC;
1935 
1936  te::da::OrderByItem* orderByItem = new te::da::OrderByItem(exp, order);
1937 
1938  orderBy->push_back(orderByItem);
1939 
1940  reader.next();
1941 
1942  assert(reader.getNodeType() == te::xml::END_ELEMENT);
1943 
1944  reader.next();
1945 
1946  assert(reader.getNodeType() == te::xml::END_ELEMENT); //OrderByItem
1947 
1948  reader.next();
1949  }
1950 
1951  assert(reader.getNodeType() == te::xml::END_ELEMENT); // OrderBy
1952 
1953  reader.next();
1954 
1955  return orderBy;
1956 }
1957 
1959 {
1960  assert(reader.getNodeType() == te::xml::START_ELEMENT);
1961  assert(reader.getElementLocalName() == "PropertyName");
1962 
1963  reader.next();
1964 
1965  assert(reader.getNodeType() == te::xml::VALUE);
1966 
1967  std::string name = reader.getElementValue();
1968 
1969  reader.next();
1970 
1971  assert(reader.getNodeType() == te::xml::END_ELEMENT); // PropertyName
1972 
1973  reader.next();
1974 
1975  return new te::da::PropertyName(name);
1976 }
1977 
1979 {
1980  assert(reader.getNodeType() == te::xml::START_ELEMENT);
1981  assert(reader.getElementLocalName() == "Select");
1982 
1983  te::da::Select* select = new te::da::Select();
1984 
1985  reader.next();
1986 
1987  if(reader.getElementLocalName() == "Fields" && reader.getNodeType() == te::xml::START_ELEMENT)
1988  {
1989  te::da::Fields* fields = ReadFields(reader);
1990  select->setFields(fields);
1991  }
1992 
1993  if(reader.getElementLocalName() == "From" && reader.getNodeType() == te::xml::START_ELEMENT)
1994  {
1995  te::da::From* from = ReadFrom(reader);
1996  select->setFrom(from);
1997  }
1998 
1999  if(reader.getElementLocalName() == "Where" && reader.getNodeType() == te::xml::START_ELEMENT)
2000  {
2001  te::da::Where* wh = ReadWhere(reader);
2002  select->setWhere(wh);
2003  }
2004 
2005  if(reader.getElementLocalName() == "GroupBy" && reader.getNodeType() == te::xml::START_ELEMENT)
2006  {
2007  te::da::GroupBy* gBy = ReadGroupBy(reader);
2008  select->setGroupBy(gBy);
2009  }
2010 
2011  if(reader.getElementLocalName() == "Having" && reader.getNodeType() == te::xml::START_ELEMENT)
2012  {
2013  te::da::Having* having = ReadHaving(reader);
2014  select->setHaving(having);
2015  }
2016 
2017  if(reader.getElementLocalName() == "OrderBy" && reader.getNodeType() == te::xml::START_ELEMENT)
2018  {
2019  te::da::OrderBy* oBy = ReadOrderBy(reader);
2020  select->setOrderBy(oBy);
2021  }
2022 
2023  if(reader.getElementLocalName() == "Distinct" && reader.getNodeType() == te::xml::START_ELEMENT)
2024  {
2025  te::da::Distinct* distinct = ReadDistinct(reader);
2026  select->setDistinct(distinct);
2027  }
2028 
2029  if(reader.getElementLocalName() == "Limit" && reader.getNodeType() == te::xml::START_ELEMENT)
2030  {
2031  reader.next();
2032  assert(reader.getNodeType() == te::xml::VALUE);
2033  select->setLimit(boost::lexical_cast<std::size_t>(reader.getElementValue()));
2034  reader.next();
2035  assert(reader.getNodeType() == te::xml::END_ELEMENT); // Limit
2036  reader.next();
2037  }
2038 
2039  if(reader.getElementLocalName() == "Offset" && reader.getNodeType() == te::xml::START_ELEMENT)
2040  {
2041  reader.next();
2042  assert(reader.getNodeType() == te::xml::VALUE);
2043  select->setOffset(boost::lexical_cast<std::size_t>(reader.getElementValue()));
2044  reader.next();
2045  assert(reader.getNodeType() == te::xml::END_ELEMENT); // Offset
2046  reader.next();
2047  }
2048 
2049  assert(reader.getNodeType() == te::xml::END_ELEMENT); // Select
2050 
2051  reader.next();
2052 
2053  return select;
2054 }
2055 
2057 {
2058  assert(reader.getNodeType() == te::xml::START_ELEMENT);
2059  assert(reader.getElementLocalName() == "Where");
2060 
2061  reader.next();
2062 
2063  te::da::Where* wh = nullptr;
2064 
2065  assert(reader.getNodeType() == te::xml::START_ELEMENT);
2066  if(reader.getElementLocalName() == "PropertyName")
2067  {
2068  wh = new te::da::Where(ReadPropertyName(reader));
2069  }
2070  else if(reader.getElementLocalName() == "Function")
2071  {
2072  wh = new te::da::Where(ReadFunction(reader));
2073  }
2074  else if(reader.getElementLocalName() == "Literal")
2075  {
2076  wh = new te::da::Where(ReadLiteral(reader));
2077  }
2078 
2079  assert(reader.getNodeType() == te::xml::END_ELEMENT); // Where
2080 
2081  reader.next();
2082 
2083  return wh;
2084 }
2085 
2087 {
2088  assert(distinct);
2089  writer.writeStartElement("te_da:Distinct");
2090 
2091  for(std::size_t i = 0; i < distinct->size(); ++i)
2092  {
2093  const te::da::Expression& exp = distinct->at(i);
2094 
2095  Save(&exp, writer);
2096  }
2097 
2098  writer.writeEndElement("te_da:Distinct");
2099 }
2100 
2102 {
2103  assert(expression);
2104 
2105  std::unique_ptr<te::da::Expression> exp(expression->clone());
2106 
2107  // Check Expression Type
2108  te::da::PropertyName* pName = dynamic_cast<te::da::PropertyName*>(exp.get());
2109  te::da::Function* func = dynamic_cast<te::da::Function*>(exp.get());
2110  te::da::Literal* lit = dynamic_cast<te::da::Literal*>(exp.get());
2111 
2112  if(pName)
2113  Save(pName, writer);
2114  else if(func)
2115  Save(func, writer);
2116  else if(lit)
2117  Save(lit, writer);
2118  else
2119  throw te::da::Exception(TE_TR("Error: Expression Type Undefined!"));
2120 }
2121 
2123 {
2124  assert(field);
2125  writer.writeStartElement("te_da:Field");
2126 
2127  Save(field->getExpression(), writer);
2128 
2129  if(field->getAlias())
2130  {
2131  writer.writeStartElement("te_da:Alias");
2132 
2133  writer.writeValue(*field->getAlias());
2134 
2135  writer.writeEndElement("te_da:Alias");
2136  }
2137 
2138  writer.writeEndElement("te_da:Field");
2139 
2140 }
2141 
2143 {
2144  assert(fields);
2145  writer.writeStartElement("te_da:Fields");
2146 
2147  for(std::size_t i = 0; i < fields->size(); ++i)
2148  {
2149  const te::da::Field& item = fields->at(i);
2150 
2151  Save(&item, writer);
2152  }
2153 
2154  writer.writeEndElement("te_da:Fields");
2155 }
2156 
2158 {
2159  writer.writeStartElement("te_da:From");
2160 
2161  for(std::size_t i = 0; i < from->size(); ++i)
2162  {
2163  const te::da::FromItem& item= from->at(i);
2164 
2165  Save(&item, writer);
2166  }
2167 
2168  writer.writeEndElement("te_da:From");
2169 }
2170 
2172 {
2173  const te::da::DataSetName* dsName = dynamic_cast<const te::da::DataSetName*>(fromItem);
2174  if(dsName)
2175  {
2176  writer.writeStartElement("te_da:FromItem");
2177 
2178  writer.writeStartElement("te_da:Value");
2179 
2180  writer.writeValue(dsName->getName());
2181 
2182  writer.writeEndElement("te_da:Value");
2183 
2184  writer.writeStartElement("te_da:Alias");
2185 
2186  writer.writeValue(fromItem->getAlias());
2187 
2188  writer.writeEndElement("te_da:Alias");
2189 
2190  writer.writeEndElement("te_da:FromItem");
2191  }
2192 
2193  const te::da::Join* dsJoin = dynamic_cast<const te::da::Join*>(fromItem);
2194  if(dsJoin)
2195  {
2196  writer.writeStartElement("te_da:JoinItem");
2197 
2198  Save(dsJoin->getFirst(), writer);
2199 
2200  Save(dsJoin->getSecond(), writer);
2201 
2202  std::string joinType;
2203  switch(dsJoin->getType())
2204  {
2205  case te::da::JOIN:
2206  joinType = "JOIN";
2207  break;
2208  case te::da::INNER_JOIN:
2209  joinType = "INNER_JOIN";
2210  break;
2211  case te::da::LEFT_JOIN:
2212  joinType = "LEFT_JOIN";
2213  break;
2214  case te::da::RIGHT_JOIN:
2215  joinType = "RIGHT_JOIN";
2216  break;
2218  joinType = "FULL_OUTER_JOIN";
2219  break;
2220  case te::da::CROSS_JOIN:
2221  joinType = "CROSS_JOIN";
2222  break;
2223  case te::da::NATURAL_JOIN:
2224  joinType = "NATURAL_JOIN";
2225  break;
2226  default:
2227  joinType = "JOIN";
2228  }
2229 
2230  writer.writeElement("te_da:Type",joinType);
2231 
2232  writer.writeStartElement("te_da:Condition");
2233 
2234  const te::da::JoinConditionOn* joinOn = dynamic_cast<const te::da::JoinConditionOn*>(dsJoin->getCondition());
2235  if(joinOn)
2236  {
2237  writer.writeStartElement("te_da:JoinConditionOn");
2238  te::da::Expression* exp = joinOn->getCondition();
2239  Save(exp, writer);
2240  writer.writeEndElement("te_da:JoinConditionOn");
2241  }
2242  const te::da::JoinConditionUsing* joinUsing = dynamic_cast<const te::da::JoinConditionUsing*>(dsJoin->getCondition());
2243  if(joinUsing)
2244  {
2245  writer.writeStartElement("te_da:JoinConditionUsing");
2246  for(std::size_t i = 0; i < joinUsing->getNumFields(); ++i)
2247  {
2248  const te::da::Expression* exp = (*joinUsing)[i];
2249  Save(exp, writer);
2250  }
2251  writer.writeEndElement("te_da:JoinConditionUsing");
2252  }
2253 
2254  writer.writeEndElement("te_da:Condition");
2255 
2256  writer.writeEndElement("te_da:JoinItem");
2257  }
2258 }
2259 
2261 {
2262  assert(func);
2263  writer.writeStartElement("te_da:Function");
2264 
2265  std::string funcName = func->getName();
2266 
2267  writer.writeElement("te_da:Name", funcName);
2268 
2269  for(std::size_t i = 0; i < func->getNumArgs(); i++)
2270  {
2271  Save(func->getArg(i), writer);
2272  }
2273 
2274  writer.writeEndElement("te_da:Function");
2275 }
2276 
2278 {
2279  assert(groupByItem);
2280  writer.writeStartElement("te_da:GroupByItem");
2281 
2282  Save(groupByItem->getExpression(), writer);
2283 
2284  writer.writeEndElement("te_da:GroupByItem");
2285 }
2286 
2288 {
2289  writer.writeStartElement("te_da:GroupBy");
2290 
2291  for(std::size_t i = 0; i < groupBy->size(); ++i)
2292  {
2293  const te::da::GroupByItem& item = groupBy->at(i);
2294 
2295  Save(&item, writer);
2296  }
2297 
2298  writer.writeEndElement("te_da:GroupBy");
2299 }
2300 
2302 {
2303  assert(having);
2304  writer.writeStartElement("te_da:Having");
2305 
2306  Save(having->getExp(), writer);
2307 
2308  writer.writeEndElement("te_da:Having");
2309 }
2310 
2312 {
2313  assert(lit);
2314  writer.writeStartElement("te_da:Literal");
2315 
2316  te::dt::AbstractData* d = lit->getValue();
2317 
2318  writer.writeAttribute("type", d->getTypeCode());
2319 
2320  writer.writeValue(d->toString());
2321 
2322  writer.writeEndElement("te_da:Literal");
2323 }
2324 
2326 {
2327  assert(orderByItem);
2328  writer.writeStartElement("te_da:OrderByItem");
2329 
2330  Save(orderByItem->getExpression(), writer);
2331 
2332  writer.writeStartElement("te_da:SortOrder");
2333  std::string so = (orderByItem->getSortOrder() == te::da::ASC ? "ASC" : "DESC");
2334  writer.writeValue(so);
2335  writer.writeEndElement("te_da:SortOrder");
2336 
2337  writer.writeEndElement("te_da:OrderByItem");
2338 }
2339 
2341 {
2342  writer.writeStartElement("te_da:OrderBy");
2343 
2344  for(std::size_t i = 0; i < orderBy->size(); ++i)
2345  {
2346  const te::da::OrderByItem& item = orderBy->at(i);
2347 
2348  Save(&item, writer);
2349  }
2350 
2351  writer.writeEndElement("te_da:OrderBy");
2352 }
2353 
2355 {
2356  assert(propertyName);
2357 
2358  writer.writeElement("te_da:PropertyName", propertyName->getName());
2359 }
2360 
2362 {
2363  assert(select);
2364  writer.writeStartElement("te_da:Select");
2365 
2366  const te::da::Fields* fields = select->getFields();
2367  if(fields)
2368  Save(fields, writer); // Fields
2369 
2370  const te::da::From* from = select->getFrom();
2371  if(from)
2372  Save(from, writer); // From
2373 
2374  const te::da::Where* wh = select->getWhere();
2375  if(wh)
2376  Save(wh, writer); // Where
2377 
2378  const te::da::GroupBy* groupBy = select->getGroupBy();
2379  if(groupBy)
2380  Save(groupBy, writer); // GroupBy
2381 
2382  const te::da::Having* having = select->getHaving();
2383  if(having)
2384  Save(having, writer); // Having
2385 
2386  const te::da::OrderBy* orderBy = select->getOrderBy();
2387  if(orderBy)
2388  Save(orderBy, writer); // OrderBy
2389 
2390  const te::da::Distinct* distinct = select->getDistinct();
2391  if(distinct)
2392  Save(distinct, writer); // Distinct
2393 
2394  if(select->getLimit() != 0) // Limit
2395  {
2396  writer.writeStartElement("te_da:Limit");
2397  writer.writeValue(static_cast<unsigned int>(select->getLimit()));
2398  writer.writeEndElement("te_da:Limit");
2399  }
2400 
2401  if(select->getOffset() != 0) // Offset
2402  {
2403  writer.writeStartElement("te_da:Offset");
2404  writer.writeValue(static_cast<unsigned int>(select->getOffset()));
2405  writer.writeEndElement("te_da:Offset");
2406  }
2407 
2408  writer.writeEndElement("te_da:Select");
2409 }
2410 
2412 {
2413  writer.writeStartElement("te_da:Where");
2414 
2415  Save(wh->getExp(), writer);
2416 
2417  writer.writeEndElement("te_da:Where");
2418 }
A class that can be used to model a filter expression that can be applied to a query.
Definition: Having.h:47
Expression * getArg(std::size_t i) const
It returns the i-th function argument.
const Distinct * getDistinct() const
It returns the Distinct modifier.
Definition: Select.cpp:844
Property * getProperty(std::size_t i) const
It returns the i-th property.
std::map< std::string, DataSourceInfoPtr >::iterator iterator
TEXSDEXPORT void Save(All *all, te::xml::AbstractWriter &writer)
const std::string & getName() const
It returns the property name.
boost::ptr_vector< GroupByItem > GroupBy
A class that can be used to model a GROUP BY clause.
Definition: GroupBy.h:37
te::da::SQLDialect * dialect
Definition: WFSDialect.h:1
A class that informs what kind of constraint and index is supported by a given data source...
const OrderBy * getOrderBy() const
It returns the list of expressions used to sort the output result.
Definition: Select.cpp:834
A class that can be used in a GROUP BY clause.
Definition: GroupByItem.h:50
An abstract class that models a source of data in a query.
Definition: FromItem.h:50
The Field class can be used to model an expression that takes part of the output items of a SELECT...
boost::shared_ptr< DataSetType > DataSetTypePtr
Definition: DataSetType.h:653
This class models a XML reader object.
Definition: xml/Reader.h:55
A class that models the name of a dataset used in a From clause.
Definition: DataSetName.h:43
TECOREEXPORT std::string URIEncode(const std::string &srcUri)
Encodes an decoded URI. The algorithm implementation is based on http://www.codeguru.com/cpp/cpp/algorithms/strings/article.php/c12759/URI-Encoding-and-Decoding.htm.
An SQL encoder for general function expressions.
TEDATAACCESSEXPORT te::da::DataSetType * ReadDataSetType(te::xml::Reader &reader)
const GroupBy * getGroupBy() const
It returns the list of expressions used to condense the result set.
Definition: Select.cpp:814
virtual void writeStartElement(const std::string &qName)=0
It represents the system catalog of a DataSource.
boost::ptr_vector< Expression > Distinct
A class that models a Distinct clause on a query.
Definition: Distinct.h:37
A base class for encoders of SQL function expressions.
A class that models the name of any property of an object.
void setDataSetTypeCapabilities(const DataSetTypeCapabilities &capabilities)
A class that models the description of a dataset.
Definition: DataSetType.h:72
void addSpecificCapability(const std::string &key, const std::string &value)
virtual void writeValue(const std::string &value)=0
Expression * getExpression() const
It returns the expression set for an output select query.
Expression * getExpression() const
It returns the exprsssion to be used to sort the result of a query.
Definition: GroupByItem.cpp:69
GeomType getGeomTypeId() const _NOEXCEPT_OP(true)
It returns the geometry subclass type identifier.
virtual Expression * clone() const =0
It creates a new copy of this expression.
static te::xml::AbstractWriter * make()
It creates a new XML writer using the dafault implementation.
It represents the SQL query dialect accepted by a given data source.
Definition: SQLDialect.h:55
virtual std::string getElementLocalName() const =0
It returns the local part of the element name in the case of an element node.
virtual boost::uint32_t getAttrAsUInt32(std::size_t i) const
It returns the attribute value in the case of an element node with valid attributes.
Definition: xml/Reader.cpp:59
Expression * getCondition() const
It returns a pointer to a join condition.
boost::ptr_vector< OrderByItem > OrderBy
A class that can be used to model an ORDER BY clause.
Definition: OrderBy.h:37
A class that represents the known capabilities of a specific data source, i.e. this class informs all...
std::size_t getNumberOfDataSets() const
It returns the number of datasets in the catalog.
void setAccessPolicy(const te::common::AccessPolicy &accessPolicy)
JoinType getType() const
It returns the join type.
Definition: Join.cpp:106
static te::dt::Date ds(2010, 01, 01)
static te::xml::Reader * make()
It creates a new XML reader using the dafault implementation.
A class that informs what the dataset implementation of a given data source can perform.
void setRootNamespaceURI(const std::string &uri)
This class models a XML writer object.
TEDATAACCESSEXPORT te::da::Having * ReadHaving(te::xml::Reader &reader)
#define TE_TR(message)
It marks a string in order to get translated.
Definition: Translator.h:242
void setSupport(const int &type, const bool &support)
TEDATAACCESSEXPORT void Read(const std::string &dialectFileName, te::da::DataSourceCapabilities &capabilities, te::da::SQLDialect &dialect)
void setSupportDataSetTypePesistenceAPI(const bool &support)
void setQueryCapabilities(const QueryCapabilities &capabilities)
void insert(const std::string &funcName, SQLFunctionEncoder *encoder)
It adds a new encoder for a given function.
Definition: SQLDialect.cpp:38
TEDATAACCESSEXPORT te::da::Function * ReadFunction(te::xml::Reader &reader)
const DataSetTypePtr & getDataSetType(std::size_t i) const
It returns the i-th dataset schema.
const From * getFrom() const
It returns the list of source information to be used by the query.
Definition: Select.cpp:794
This is an abstract class that models a query expression.
virtual boost::int32_t getAttrAsInt32(const std::string &name) const
It returns the attribute value in the case of an element node with valid attributes.
Definition: xml/Reader.cpp:49
A query encoder for binary operations.
SortOrder getSortOrder() const
It returns the order of sorting: Asc or Desc.
Definition: OrderByItem.cpp:82
void setSupportTransactions(const bool &support)
te::da::SQLDialect * mydialect
Definition: OGRDialect.h:1
A class that represents the supported data types of a specific data source.
AccessPolicy
Supported data access policies (can be used as bitfield).
void setSupportPreparedQueryAPI(const bool &support)
virtual std::string toString() const =0
It returns the data value in a string notation.
virtual void writeElement(const std::string &qName, const std::string &value)=0
virtual std::string getAttr(const std::string &name) const =0
It returns the attribute value in the case of an element node with valid attributes.
TEDATAACCESSEXPORT te::da::Where * ReadWhere(te::xml::Reader &reader)
A class that informs the query support of a given data source.
void setSupportDataSetPesistenceAPI(const bool &support)
static DataSourceInfoManager & getInstance()
It returns a reference to the singleton instance.
virtual void writeToFile()=0
const std::string & getAlias() const
It returns the alias associated to the source item.
Definition: FromItem.cpp:47
This class models a literal value.
te::da::DataSourceCapabilities capabilities
A condition to be used in a Join clause.
Definition: JoinCondition.h:44
static te::dt::DateTime d(2010, 8, 9, 15, 58, 39)
static te::dt::TimeDuration dt(20, 30, 50, 11)
TEDATAACCESSEXPORT void Save(const std::string &fileName)
boost::ptr_vector< Field > Fields
Fields is just a boost::ptr_vector of Field pointers.
Definition: Fields.h:37
JoinType
The type of join in a query.
TEDATAACCESSEXPORT te::da::From * ReadFrom(te::xml::Reader &reader)
A class that can be used to model a filter expression that can be applied to a query.
Definition: Where.h:47
te::gm::Polygon * p
std::string * getAlias() const
It returns the alias for the outout expression.
TEDATAACCESSEXPORT te::da::Distinct * ReadDistinct(te::xml::Reader &reader)
A base class for values that can be retrieved from the data access module.
Definition: AbstractData.h:57
std::size_t getOffset() const
It tells the number of rows to skip before starting to return rows.
Definition: Select.cpp:864
Expression * getExp() const
Definition: Where.cpp:58
A class that models a Function expression.
const Fields * getFields() const
It returns the list of output expressions used to form the result set.
Definition: Select.cpp:784
A Join clause combines two FromItems.
Definition: Join.h:50
Expression * getExp() const
Definition: Having.cpp:58
void setDataSetCapabilities(const DataSetCapabilities &capabilities)
A class that models a literal for double values.
Definition: LiteralDouble.h:43
TEDATAACCESSEXPORT te::da::FromItem * ReadFromItem(te::xml::Reader &reader)
std::size_t size() const
It returns the number of properties of the CompositeProperty.
te::common::AccessPolicy Convert2Terralib(std::string accessPolicy)
SortOrder
Sort order type: asc or desc.
void setAlias(std::string *alias)
As you know, sometimes is better to give an alias to an output expression.
std::size_t getNumFields() const
It returns the number of fields in this join condition.
const std::string & getName() const
It returns the function name.
void setSupportSQLDialect(const bool &support)
TEDATAACCESSEXPORT te::da::OrderBy * ReadOrderBy(te::xml::Reader &reader)
TEDATAACCESSEXPORT te::da::GroupBy * ReadGroupBy(te::xml::Reader &reader)
A Select models a query to be used when retrieving data from a DataSource.
Definition: Select.h:65
void setSupportBidirectionalTraversing(const bool &support)
boost::ptr_vector< FromItem > From
It models the FROM clause for a query.
Definition: From.h:37
A query encoder for binary operator expressions.
void setSupportBatchExecutorAPI(const bool &support)
FromItem * getSecond() const
It returns the second item involved in the join.
Definition: Join.cpp:96
virtual int getTypeCode() const =0
It returns the data type code associated to the data value.
TEDATAACCESSEXPORT te::da::DataSourceCatalog * ReadDataSourceCatalog(te::xml::Reader &reader)
Where * getWhere() const
It returns the filter condition.
Definition: Select.cpp:804
TEDATAACCESSEXPORT te::da::SQLDialect * ReadDialect(const std::string &dialectFileName)
JoinCondition * getCondition() const
It returns the join condition.
Definition: Join.cpp:116
virtual void writeAttribute(const std::string &attName, const std::string &value)=0
JoinConditionUsing class can be used to model a USING clause in a Join.
A query encoder for unary operator expressions.
TEDATAACCESSEXPORT te::da::Select * ReadSelect(te::xml::Reader &reader)
void setDataTypeCapabilities(const DataTypeCapabilities &capabilities)
const Having * getHaving() const
It returns the list of expressions used to eliminate group row that doesn&#39;t satisfy the condition...
Definition: Select.cpp:824
void setSupportPrimaryKey(const bool &support)
TECOREEXPORT std::string FindInTerraLibPath(const std::string &path)
Returns the path relative to a directory or file in the context of TerraLib.
std::size_t getLimit() const
It tells the maximum number of rows to return.
Definition: Select.cpp:854
const std::string & getName() const
It returns the dataset name.
Definition: DataSetName.cpp:55
TEDATAACCESSEXPORT te::da::Fields * ReadFields(te::xml::Reader &reader)
virtual void writeEndElement(const std::string &qName)=0
A class that represents a data source component.
virtual void writeStartDocument(const std::string &encoding, const std::string &standalone)=0
virtual std::string getElementValue() const =0
It returns the element data value in the case of VALUE node.
virtual NodeType getNodeType() const =0
It return the type of node read.
JoinConditionOn is a boolean expression and it specifies which items in a join are considered to matc...
TECOREEXPORT std::string URIDecode(const std::string &srcUri)
Decodes an encoded URI. The algorithm implementation is based on http://www.codeguru.com/cpp/cpp/algorithms/strings/article.php/c12759/URI-Encoding-and-Decoding.htm.
A class that can be used in an ORDER BY clause to sort the items of a resulting query.
Definition: OrderByItem.h:53
Expression * getExpression() const
It returns the exprsssion to be used to sort the result of a query.
Definition: OrderByItem.cpp:72
static bool isRegularFile(const std::string &path)
Checks if a given path in UTF-8 is a regular file.
Definition: FileSystem.cpp:98
virtual bool next()=0
It gets the next event to be read.
te::dt::AbstractData * getValue() const
It returns the value associated to the literal.
A base class for binary functions.
std::size_t getNumArgs() const
It returns the number of arguments informed to the function.
TEDATAACCESSEXPORT te::da::PropertyName * ReadPropertyName(te::xml::Reader &reader)
unsigned int getId() const
It returns the property identifier.
Definition: Property.h:109
TEDATATYPEEXPORT int Convert2Terralib(const std::string &dataType)
It convert a string to a DataType.
TEDATAACCESSEXPORT te::da::Literal * ReadLiteral(te::xml::Reader &reader)
FromItem * getFirst() const
It returns the first from item involved in the join.
Definition: Join.cpp:86
boost::shared_ptr< DataSourceInfo > DataSourceInfoPtr
TEDATAACCESSEXPORT void ReadDataSourceInfo(const std::string &datasourcesFileName)
const std::string & getTitle() const
A human descriptive title for the DataSetType.
Definition: DataSetType.h:130
A class that models a literal for Geometry values.
Definition: LiteralGeom.h:46
This class models a string Literal value.
Definition: LiteralString.h:46
const std::string & getName() const
It returns the property name.
Definition: Property.h:127
static Geometry * read(const char *wkt)
It returns a valid Geometry from a given WKT.