Describe the enhancement requested
GeospatialStatistics.noopBuilder() is called for every non-geometry column in every row group. Today, each call allocates a new NoopBuilder (plus a WKBReader, BoundingBox, and GeospatialTypes that are never used), and each build() allocates a new GeospatialStatistics(null, null) that is immediately discarded.
Since NoopBuilder carries no state and all its methods are no-ops, it can be a singleton. Its build() result is equally stateless (null fields, with merge/abort guarded by null checks), so it can be cached too.
Proposed Changes
- Make
NoopBuilder a singleton via a static INSTANCE field
- Cache
build() output as a static EMPTY instance
- Add a package-private super constructor that skips field initialization so the singleton doesn't allocate unused objects
This eliminates per-column-per-row-group allocations on the common path where geospatial statistics are disabled.
Component(s)
Core
Describe the enhancement requested
GeospatialStatistics.noopBuilder()is called for every non-geometry column in every row group. Today, each call allocates a newNoopBuilder(plus aWKBReader,BoundingBox, andGeospatialTypesthat are never used), and eachbuild()allocates a newGeospatialStatistics(null, null)that is immediately discarded.Since
NoopBuildercarries no state and all its methods are no-ops, it can be a singleton. Itsbuild()result is equally stateless (null fields, with merge/abort guarded by null checks), so it can be cached too.Proposed Changes
NoopBuildera singleton via a staticINSTANCEfieldbuild()output as a staticEMPTYinstanceThis eliminates per-column-per-row-group allocations on the common path where geospatial statistics are disabled.
Component(s)
Core