14#ifndef OGR_GENSQL_H_INCLUDED
15#define OGR_GENSQL_H_INCLUDED
26#define GEOM_FIELD_INDEX_TO_ALL_FIELD_INDEX(poFDefn, iGeom) \
27 ((poFDefn)->GetFieldCount() + SPECIAL_FIELD_COUNT + (iGeom))
29#define IS_GEOM_FIELD_INDEX(poFDefn, idx) \
30 (((idx) >= (poFDefn)->GetFieldCount() + SPECIAL_FIELD_COUNT) && \
31 ((idx) < (poFDefn)->GetFieldCount() + SPECIAL_FIELD_COUNT + \
32 (poFDefn)->GetGeomFieldCount()))
34#define ALL_FIELD_INDEX_TO_GEOM_FIELD_INDEX(poFDefn, idx) \
35 ((idx) - ((poFDefn)->GetFieldCount() + SPECIAL_FIELD_COUNT))
43class OGRGenSQLResultsLayer final :
public OGRLayer
46 GDALDataset *m_poSrcDS =
nullptr;
47 OGRLayer *m_poSrcLayer =
nullptr;
48 std::unique_ptr<swq_select> m_pSelectInfo{};
50 std::string m_osInitialWHERE{};
51 bool m_bForwardWhereToSourceLayer =
true;
53 bool m_bSpatialFilterSetOnSourceLayer =
false;
56 std::vector<OGRLayer *> m_apoTableLayers{};
59 std::vector<std::unique_ptr<GDALDataset, GDALDatasetUniquePtrReleaser>>
62 OGRFeatureDefn *m_poDefn =
nullptr;
64 std::vector<int> m_anGeomFieldToSrcGeomField{};
66 std::vector<GIntBig> m_anFIDIndex{};
67 bool m_bOrderByValid =
false;
70 mutable std::unique_ptr<OGRFeature> m_poSummaryFeature{};
72 int m_iFIDFieldIndex = 0;
74 GIntBig m_nIteratedFeatures = -1;
75 std::vector<std::string> m_aosDistinctList{};
77 bool PrepareSummary()
const;
79 std::unique_ptr<OGRFeature> TranslateFeature(std::unique_ptr<OGRFeature>);
80 void CreateOrderByIndex();
81 void ReadIndexFields(OGRFeature *poSrcFeat,
int nOrderItems,
82 OGRField *pasIndexFields);
83 void SortIndexSection(
const OGRField *pasIndexFields,
GIntBig *panMerged,
84 size_t nStart,
size_t nEntries);
85 void FreeIndexFields(OGRField *pasIndexFields,
size_t l_nIndexSize);
86 int Compare(
const OGRField *pasFirst,
const OGRField *pasSecond);
89 void ApplyFiltersToSource();
91 void FindAndSetIgnoredFields();
92 void ExploreExprForIgnoredFields(swq_expr_node *expr,
CPLHashSet *hSet);
93 void AddFieldDefnToSet(
int iTable,
int iColumn,
CPLHashSet *hSet);
95 int ContainGeomSpecialField(
const swq_expr_node *expr)
const;
97 void InvalidateOrderByIndex();
99 int MustEvaluateSpatialFilterOnGenSQL();
104 OGRGenSQLResultsLayer(GDALDataset *poSrcDS,
105 std::unique_ptr<swq_select> &&pSelectInfo,
106 const OGRGeometry *poSpatFilter,
const char *pszWHERE,
107 const char *pszDialect);
108 ~OGRGenSQLResultsLayer()
override;
122 bool bForce)
override;
127 const OGRGeometry *)
override;
134 struct ArrowSchema *out_schema)
override;
137 friend struct OGRGenSQLResultsLayerArrowStreamPrivateData;
139 int GetArrowSchemaForwarded(
struct ArrowArrayStream *stream,
140 struct ArrowSchema *out_schema)
const;
143 struct ArrowArray *out_array)
override;
145 int GetNextArrowArrayForwarded(
struct ArrowArrayStream *stream,
146 struct ArrowArray *out_array);
This class represents a layer of simple features, with access methods.
Definition ogrsf_frmts.h:61
virtual OGRErr ISetSpatialFilter(int iGeomField, const OGRGeometry *)
Set a new spatial filter.
Definition ogrlayer.cpp:3398
virtual GIntBig GetFeatureCount(int bForce=TRUE)
Fetch the feature count in this layer.
Definition ogrlayer.cpp:205
virtual bool GetArrowStream(struct ArrowArrayStream *out_stream, CSLConstList papszOptions=nullptr)
Get a Arrow C stream.
Definition ogrlayerarrow.cpp:2584
virtual int GetNextArrowArray(struct ArrowArrayStream *, struct ArrowArray *out_array)
Default implementation of the ArrowArrayStream::get_next() callback.
Definition ogrlayerarrow.cpp:1936
virtual OGRErr IGetExtent(int iGeomField, OGREnvelope *psExtent, bool bForce)
Fetch the extent of this layer, on the specified geometry field.
Definition ogrlayer.cpp:377
virtual void ResetReading()=0
Reset feature reading to start on the first feature.
virtual const OGRFeatureDefn * GetLayerDefn() const =0
Fetch the schema information for this layer.
virtual OGRErr SetNextByIndex(GIntBig nIndex)
Move read cursor to the nIndex'th feature in the current resultset.
Definition ogrlayer.cpp:1033
virtual OGRErr SetAttributeFilter(const char *)
Set a new attribute query.
Definition ogrlayer.cpp:751
virtual int TestCapability(const char *) const =0
Test if this layer supported the named capability.
virtual OGRFeature * GetFeature(GIntBig nFID)
Fetch a feature by its identifier.
Definition ogrlayer.cpp:918
virtual int GetArrowSchema(struct ArrowArrayStream *, struct ArrowSchema *out_schema)
Default implementation of the ArrowArrayStream::get_schema() callback.
Definition ogrlayerarrow.cpp:377
virtual OGRGeometry * GetSpatialFilter()
This method returns the current spatial filter for this layer.
Definition ogrlayer.cpp:3200
virtual OGRFeature * GetNextFeature()=0
Fetch the next available feature from this layer.
struct _CPLHashSet CPLHashSet
Opaque type for a hash set.
Definition cpl_hash_set.h:35
#define CPL_DISALLOW_COPY_ASSIGN(ClassName)
Helper to remove the copy and assignment constructors so that the compiler will not generate the defa...
Definition cpl_port.h:936
char ** CSLConstList
Type of a constant null-terminated list of nul terminated strings.
Definition cpl_port.h:1087
long long GIntBig
Large signed integer type (generally 64-bit integer type).
Definition cpl_port.h:205
Various convenience functions for working with strings and string lists.
int OGRErr
Type for a OGR error.
Definition ogr_core.h:370
Classes related to registration of format support, and opening datasets.