src/terralib/postgis/SQLVisitor.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/postgis/SQLVisitor.cpp
22 
23  \brief A visitor for building an SQL statement from a given Query hierarchy.
24 */
25 
26 // TerraLib
27 #include "../datatype/DateTime.h"
28 #include "../dataaccess/query/LiteralByteArray.h"
29 #include "../dataaccess/query/LiteralDateTime.h"
30 #include "../dataaccess/query/LiteralEnvelope.h"
31 #include "../dataaccess/query/LiteralGeom.h"
32 #include "SQLVisitor.h"
33 #include "Utils.h"
34 
35 // STL
36 #include <cassert>
37 
39  : te::da::SQLVisitor(dialect, sql),
40  m_conn(conn)
41 {
42 }
43 
45 {
46  assert(visited.getValue() != nullptr);
47  assert(false); //TODO
48 }
49 
51 {
52  assert(visited.getValue() != nullptr);
53  te::dt::DateTime* dateTime = dynamic_cast<te::dt::DateTime*>(visited.getValue());
54  std::string dateStr = dateTime->toString();
55  auto pos = dateStr.find("OFF");
56  if(pos != std::string::npos)
57  dateStr = dateStr.replace(pos, 3, "");
58 
59  m_sql+= "\'"+dateStr+"\'";
60 }
61 
63 {
64  assert(visited.getValue() != nullptr);
65  Convert2PostGIS(visited.getValue(), visited.getSRID(), m_sql);
66 }
67 
69 {
70  assert(visited.getValue() != nullptr);
71  Convert2PostGIS(m_conn, static_cast<te::gm::Geometry*>(visited.getValue()), m_sql);
72 }
73 
75 {
76  m_sql += "DISTINCT (";
77 
78  for (std::size_t i = 0; i < visited.size(); ++i)
79  {
80  if (i != 0)
81  m_sql += ", ";
82 
83  visited[i].accept(*this);
84  }
85 
86  m_sql += ")";
87 }
te::da::SQLDialect * dialect
Definition: WFSDialect.h:1
A visitor for building an SQL statement using PostGIS dialect.
boost::ptr_vector< Expression > Distinct
A class that models a Distinct clause on a query.
Definition: Distinct.h:37
PGconn * m_conn
The PostGIS connection used to escape string!
Utility functions for PostgreSQL.
It represents the SQL query dialect accepted by a given data source.
Definition: SQLDialect.h:55
A visitor for building an SQL statement using PostGIS dialect.
A class that models a literal for Date and Time values.
struct pg_conn PGconn
virtual std::string toString() const =0
It returns the data value in a string notation.
void Convert2PostGIS(const te::gm::Envelope *e, int srid, std::string &output)
It converts the envelope into a PostGIS BOX3D.
URI C++ Library.
Definition: Attributes.h:37
A class that models a literal for ByteArray values.
std::string & m_sql
The buffer string where the query will be outputed.
int getSRID() const
It returns the envelope SRS id.
void visit(const te::da::LiteralByteArray &visited)
void visitDistinct(const te::da::Distinct &visited)
A class that models a literal for Envelope values.
SQLVisitor(const te::da::SQLDialect &dialect, std::string &sql, PGconn *conn)
Default constructor.
te::dt::AbstractData * getValue() const
It returns the value associated to the literal.
te::gm::Envelope * getValue() const
It returns the associated envelope value.
A class that models a literal for Geometry values.
Definition: LiteralGeom.h:46