cla-bot · GitHub

Adds Sources/SkipFirebaseFirestore/Pipeline.swift with the minimum
API surface needed for full-text search via the Firestore Pipeline API:
- Firestore.pipeline() -> PipelineSource (extension on existing wrapper)
- PipelineSource.collection(_:) / collectionGroup(_:) -> Pipeline
- Pipeline.where(_:) / search(query:) / limit(_:) / offset(_:) -> Pipeline
- Pipeline.execute() async throws -> PipelineSnapshot
- PipelineSnapshot.results: [PipelineResult]
- PipelineResult.id / data()
- Field(_:) — wraps com.google.firebase.firestore.pipeline.Field.field()
- DocumentMatches(_:) — wraps Expression.documentMatches() on Android
- Expression / BooleanExpression protocols bridging iOS + Android types
Includes compile-time smoke tests in PipelineTests.swift.
…idge gen
The first cut used Swift protocols (Expression, BooleanExpression) with
Kotlin-only return types and a 'where' method, both of which broke Skip
bridge generation:
- 'where' is a Swift keyword; the auto-generated Pipeline_Bridge.swift
  produced unescaped identifier usage that won't compile.
- Protocols whose signatures reference com.google.firebase.firestore.pipeline.*
  cannot be bridged to iOS, where those Kotlin types do not exist; the
  generated _BridgeImpl types fail conformance.
Switch to the SkipFirebaseFirestore.swift convention used throughout the
package: concrete final classes that extend KotlinConverting<...> and
expose the platform value via a 'kotlin()' override. Rename .where(...)
to .whereCondition(...) to dodge the keyword. Collapse the Expression /
Field / BooleanExpression hierarchy into a single PipelineBooleanExpression
with static factories (documentMatches, fieldEqualTo, fieldArrayContainsAny)
since that's all the search call sites need.

@IT-Guy007

…store
PipelineTests.swift was calling iOS-native FirebaseFirestore Pipeline
APIs (Field.equalTo, PipelineSnapshot, PipelineResult.data()) but the
native iOS SDK 12.12.1 exposes those with different shapes (equal not
equalTo, no PipelineSnapshot wrapper, .data is a property). The Skip
wrapper exists only on the SKIP/Android path — iOS gets Pipeline via
@_exported import FirebaseFirestore directly. Gate the test class with
#if SKIP so it exercises the wrapper only where the wrapper applies, and
use the renamed API (whereCondition, PipelineBooleanExpression factories).
…, error scope
Three issues in the Android (Kotlin) transpile pass:
- 'field' factory lives on Expression.Companion, not Field.Companion
  (api.txt: 'method public static final ... Expression.field(String)').
  Switch from Field.field(name) to Expression.field(name).
- snapshot.results.map { ... } returns Kotlin List but the property
  signature is Skip-Array. Rewrite with arrayOf() + append loop so the
  return type matches.
- execute() referenced fileprivate asNSError from SkipFirebaseFirestore.swift
  which Kotlin can't access across files. Drop the catch — propagate
  FirebaseFirestoreException as-is (the existing rest of the package
  follows the same pattern in non-private call sites).

@IT-Guy007

IT-Guy007 marked this pull request as ready for review

June 17, 2026 16:24

@marcprux

@IT-Guy007

IT-Guy007 deleted the feature/CLUBAPP-459-pipeline-api branch

June 17, 2026 17:55

Read the original on github.com ↗