31 #ifndef OGR_GENSQL_H_INCLUDED
32 #define OGR_GENSQL_H_INCLUDED
43 #define GEOM_FIELD_INDEX_TO_ALL_FIELD_INDEX(poFDefn, iGeom) \
44 ((poFDefn)->GetFieldCount() + SPECIAL_FIELD_COUNT + (iGeom))
46 #define IS_GEOM_FIELD_INDEX(poFDefn, idx) \
47 (((idx) >= (poFDefn)->GetFieldCount() + SPECIAL_FIELD_COUNT) && \
48 ((idx) < (poFDefn)->GetFieldCount() + SPECIAL_FIELD_COUNT + \
49 (poFDefn)->GetGeomFieldCount()))
51 #define ALL_FIELD_INDEX_TO_GEOM_FIELD_INDEX(poFDefn, idx) \
52 ((idx) - ((poFDefn)->GetFieldCount() + SPECIAL_FIELD_COUNT))
58 class OGRGenSQLResultsLayer final :
public OGRLayer
65 std::string m_osInitialWHERE{};
66 bool m_bForwardWhereToSourceLayer =
true;
72 int *panGeomFieldToSrcGeomField;
87 std::vector<CPLString> m_oDistinctList;
92 void CreateOrderByIndex();
93 void ReadIndexFields(
OGRFeature *poSrcFeat,
int nOrderItems,
95 void SortIndexSection(
const OGRField *pasIndexFields,
GIntBig *panMerged,
96 size_t nStart,
size_t nEntries);
97 void FreeIndexFields(
OGRField *pasIndexFields,
size_t l_nIndexSize,
98 bool bFreeArray =
true);
102 void ApplyFiltersToSource();
104 void FindAndSetIgnoredFields();
105 void ExploreExprForIgnoredFields(swq_expr_node *expr,
CPLHashSet *hSet);
106 void AddFieldDefnToSet(
int iTable,
int iColumn,
CPLHashSet *hSet);
108 int ContainGeomSpecialField(swq_expr_node *expr);
110 void InvalidateOrderByIndex();
112 int MustEvaluateSpatialFilterOnGenSQL();
117 OGRGenSQLResultsLayer(
GDALDataset *poSrcDS,
void *pSelectInfo,
119 const char *pszDialect);
120 virtual ~OGRGenSQLResultsLayer();
137 int bForce = TRUE)
override;
virtual void ResetReading()=0
Reset feature reading to start on the first feature.
virtual GIntBig GetFeatureCount(int bForce=TRUE)
Fetch the feature count in this layer.
Definition: ogrlayer.cpp:178
Abstract base class for all geometry classes.
Definition: ogr_geometry.h:334
This class represents a layer of simple features, with access methods.
Definition: ogrsf_frmts.h:72
virtual OGRGeometry * GetSpatialFilter()
This method returns the current spatial filter for this layer.
Definition: ogrlayer.cpp:1274
virtual OGRErr GetExtent(OGREnvelope *psExtent, int bForce=TRUE)
Fetch the extent of this layer.
Definition: ogrlayer.cpp:216
virtual void SetSpatialFilter(OGRGeometry *)
Set a new spatial filter.
Definition: ogrlayer.cpp:1302
virtual OGRFeatureDefn * GetLayerDefn()=0
Fetch the schema information for this layer.
A set of associated raster bands, usually from one file.
Definition: gdal_priv.h:347
struct _CPLHashSet CPLHashSet
Opaque type for a hash set.
Definition: cpl_hash_set.h:52
OGRFeature field attribute value union.
Definition: ogr_core.h:877
int OGRErr
Type for a OGR error.
Definition: ogr_core.h:378
long long GIntBig
Large signed integer type (generally 64-bit integer type).
Definition: cpl_port.h:235
A simple feature, including geometry and attributes.
Definition: ogr_feature.h:669
virtual OGRErr SetNextByIndex(GIntBig nIndex)
Move read cursor to the nIndex'th feature in the current resultset.
Definition: ogrlayer.cpp:506
Simple container for a bounding region (rectangle)
Definition: ogr_core.h:57
Definition of a feature class or feature layer.
Definition: ogr_feature.h:374
virtual OGRErr SetAttributeFilter(const char *)
Set a new attribute query.
Definition: ogrlayer.cpp:345
virtual int TestCapability(const char *)=0
Test if this layer supported the named capability.
virtual OGRFeature * GetNextFeature()=0
Fetch the next available feature from this layer.
virtual OGRFeature * GetFeature(GIntBig nFID)
Fetch a feature by its identifier.
Definition: ogrlayer.cpp:452
#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:1051