diff --git a/autotest/ogr/ogr_parquet.py b/autotest/ogr/ogr_parquet.py index d0baf5726ad7..0d34e48f9a54 100755 --- a/autotest/ogr/ogr_parquet.py +++ b/autotest/ogr/ogr_parquet.py @@ -3870,6 +3870,8 @@ def check(lyr): lyr = ds.GetLayer(0) lyr.SetIgnoredFields(["foo"]) check(lyr) + lyr.SetSpatialFilter(geom) + assert lyr.GetFeatureCount() == (3 if geom.GetGeometryCount() > 1 else 2) ds = ogr.Open(filename_to_open) lyr = ds.GetLayer(0) diff --git a/ogr/ogrsf_frmts/arrow_common/ograrrowlayer.hpp b/ogr/ogrsf_frmts/arrow_common/ograrrowlayer.hpp index 341ca12803fa..cd51cf2905d9 100644 --- a/ogr/ogrsf_frmts/arrow_common/ograrrowlayer.hpp +++ b/ogr/ogrsf_frmts/arrow_common/ograrrowlayer.hpp @@ -4013,62 +4013,65 @@ OGRArrowLayer::SetBatch(const std::shared_ptr &poBatch) { const int idx = m_bIgnoredFields ? oIter->second.iArrayIdx : oIter->second.iArrowCol; - CPLAssert(idx >= 0); - CPLAssert(static_cast(idx) < m_poBatchColumns.size()); - m_poArrayBBOX = m_poBatchColumns[idx].get(); - CPLAssert(m_poArrayBBOX->type_id() == arrow::Type::STRUCT); - const auto castArray = - static_cast(m_poArrayBBOX); - const auto &subArrays = castArray->fields(); - CPLAssert( - static_cast(oIter->second.iArrowSubfieldXMin) < - subArrays.size()); - const auto xminArray = - subArrays[oIter->second.iArrowSubfieldXMin].get(); - CPLAssert( - static_cast(oIter->second.iArrowSubfieldYMin) < - subArrays.size()); - const auto yminArray = - subArrays[oIter->second.iArrowSubfieldYMin].get(); - CPLAssert( - static_cast(oIter->second.iArrowSubfieldXMax) < - subArrays.size()); - const auto xmaxArray = - subArrays[oIter->second.iArrowSubfieldXMax].get(); - CPLAssert( - static_cast(oIter->second.iArrowSubfieldYMax) < - subArrays.size()); - const auto ymaxArray = - subArrays[oIter->second.iArrowSubfieldYMax].get(); - if (oIter->second.bIsFloat) + if (idx >= 0) { - CPLAssert(xminArray->type_id() == arrow::Type::FLOAT); - m_poArrayXMinFloat = - static_cast(xminArray); - CPLAssert(yminArray->type_id() == arrow::Type::FLOAT); - m_poArrayYMinFloat = - static_cast(yminArray); - CPLAssert(xmaxArray->type_id() == arrow::Type::FLOAT); - m_poArrayXMaxFloat = - static_cast(xmaxArray); - CPLAssert(ymaxArray->type_id() == arrow::Type::FLOAT); - m_poArrayYMaxFloat = - static_cast(ymaxArray); - } - else - { - CPLAssert(xminArray->type_id() == arrow::Type::DOUBLE); - m_poArrayXMinDouble = - static_cast(xminArray); - CPLAssert(yminArray->type_id() == arrow::Type::DOUBLE); - m_poArrayYMinDouble = - static_cast(yminArray); - CPLAssert(xmaxArray->type_id() == arrow::Type::DOUBLE); - m_poArrayXMaxDouble = - static_cast(xmaxArray); - CPLAssert(ymaxArray->type_id() == arrow::Type::DOUBLE); - m_poArrayYMaxDouble = - static_cast(ymaxArray); + CPLAssert(static_cast(idx) < + m_poBatchColumns.size()); + m_poArrayBBOX = m_poBatchColumns[idx].get(); + CPLAssert(m_poArrayBBOX->type_id() == arrow::Type::STRUCT); + const auto castArray = + static_cast(m_poArrayBBOX); + const auto &subArrays = castArray->fields(); + CPLAssert( + static_cast(oIter->second.iArrowSubfieldXMin) < + subArrays.size()); + const auto xminArray = + subArrays[oIter->second.iArrowSubfieldXMin].get(); + CPLAssert( + static_cast(oIter->second.iArrowSubfieldYMin) < + subArrays.size()); + const auto yminArray = + subArrays[oIter->second.iArrowSubfieldYMin].get(); + CPLAssert( + static_cast(oIter->second.iArrowSubfieldXMax) < + subArrays.size()); + const auto xmaxArray = + subArrays[oIter->second.iArrowSubfieldXMax].get(); + CPLAssert( + static_cast(oIter->second.iArrowSubfieldYMax) < + subArrays.size()); + const auto ymaxArray = + subArrays[oIter->second.iArrowSubfieldYMax].get(); + if (oIter->second.bIsFloat) + { + CPLAssert(xminArray->type_id() == arrow::Type::FLOAT); + m_poArrayXMinFloat = + static_cast(xminArray); + CPLAssert(yminArray->type_id() == arrow::Type::FLOAT); + m_poArrayYMinFloat = + static_cast(yminArray); + CPLAssert(xmaxArray->type_id() == arrow::Type::FLOAT); + m_poArrayXMaxFloat = + static_cast(xmaxArray); + CPLAssert(ymaxArray->type_id() == arrow::Type::FLOAT); + m_poArrayYMaxFloat = + static_cast(ymaxArray); + } + else + { + CPLAssert(xminArray->type_id() == arrow::Type::DOUBLE); + m_poArrayXMinDouble = + static_cast(xminArray); + CPLAssert(yminArray->type_id() == arrow::Type::DOUBLE); + m_poArrayYMinDouble = + static_cast(yminArray); + CPLAssert(xmaxArray->type_id() == arrow::Type::DOUBLE); + m_poArrayXMaxDouble = + static_cast(xmaxArray); + CPLAssert(ymaxArray->type_id() == arrow::Type::DOUBLE); + m_poArrayYMaxDouble = + static_cast(ymaxArray); + } } } } diff --git a/ogr/ogrsf_frmts/parquet/ogrparquetlayer.cpp b/ogr/ogrsf_frmts/parquet/ogrparquetlayer.cpp index d001813141e0..16cdf040723d 100644 --- a/ogr/ogrsf_frmts/parquet/ogrparquetlayer.cpp +++ b/ogr/ogrsf_frmts/parquet/ogrparquetlayer.cpp @@ -1980,8 +1980,7 @@ OGRErr OGRParquetLayer::SetIgnoredFields(CSLConstList papszFields) m_oMapGeomFieldIndexToGeomColBBOXParquet.find(i); if (oIter != m_oMapGeomFieldIndexToGeomColBBOX.end() && oIterParquet != - m_oMapGeomFieldIndexToGeomColBBOXParquet.end() && - !OGRArrowIsGeoArrowStruct(m_aeGeomEncoding[i])) + m_oMapGeomFieldIndexToGeomColBBOXParquet.end()) { oIter->second.iArrayIdx = nBatchColumns++; m_anRequestedParquetColumns.insert(