Skip to content

Conversation

@KyleAMathews
Copy link
Collaborator

@KyleAMathews KyleAMathews commented Jan 12, 2026

Summary

Extends min() and max() aggregate functions to support string fields, using lexicographic comparison. This matches standard SQL behavior where MIN/MAX on text columns return alphabetically first/last values.


Approach

Added string to the set of comparable types at three layers:

  1. Type definitions (db-ivm/groupBy.ts): Extended CanMinMax type union
  2. Type inference (db/builder/functions.ts): Extended AggregateReturnType helper
  3. Runtime evaluation (db/compiler/group-by.ts): Updated the value extractor to preserve strings for comparison instead of coercing to numbers

The value extractor was renamed from valueExtractorWithDate to valueExtractorForMinMax to reflect its broader purpose.

Key Invariants

  • Strings compare lexicographically (e.g., "apple" < "banana")
  • Null/undefined values are handled consistently with existing behavior
  • Type safety is preserved—TypeScript knows min(stringField) returns a string

Non-goals

  • Locale-aware collation (uses JavaScript's default string comparison)
  • Case-insensitive comparison

Verification

pnpm test packages/db/tests/query/group-by.test.ts

The new test covers min/max on status and product_category string fields across multiple customers, verifying alphabetical ordering.

Files Changed

File Change
packages/db-ivm/src/operators/groupBy.ts Add string to CanMinMax type
packages/db/src/query/builder/functions.ts Add string to AggregateReturnType
packages/db/src/query/compiler/group-by.ts Preserve strings in min/max value extractor
packages/db/tests/query/group-by.test.ts Add test for string min/max

Add support for string values in min() and max() aggregate functions,
using lexicographic comparison (same as SQL behavior).

Changes:
- Add `string` to CanMinMax type in db-ivm/groupBy.ts
- Update AggregateReturnType to include string in db/builder/functions.ts
- Update valueExtractor in group-by.ts compiler to preserve strings
- Add test case for min/max on string fields
@changeset-bot
Copy link

changeset-bot bot commented Jan 12, 2026

🦋 Changeset detected

Latest commit: 51782b6

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 13 packages
Name Type
@tanstack/db Patch
@tanstack/db-ivm Patch
@tanstack/angular-db Patch
@tanstack/electric-db-collection Patch
@tanstack/offline-transactions Patch
@tanstack/powersync-db-collection Patch
@tanstack/query-db-collection Patch
@tanstack/react-db Patch
@tanstack/rxdb-db-collection Patch
@tanstack/solid-db Patch
@tanstack/svelte-db Patch
@tanstack/trailbase-db-collection Patch
@tanstack/vue-db Patch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@pkg-pr-new
Copy link

pkg-pr-new bot commented Jan 12, 2026

More templates

@tanstack/angular-db

npm i https://pkg.pr.new/@tanstack/angular-db@1120

@tanstack/db

npm i https://pkg.pr.new/@tanstack/db@1120

@tanstack/db-ivm

npm i https://pkg.pr.new/@tanstack/db-ivm@1120

@tanstack/electric-db-collection

npm i https://pkg.pr.new/@tanstack/electric-db-collection@1120

@tanstack/offline-transactions

npm i https://pkg.pr.new/@tanstack/offline-transactions@1120

@tanstack/powersync-db-collection

npm i https://pkg.pr.new/@tanstack/powersync-db-collection@1120

@tanstack/query-db-collection

npm i https://pkg.pr.new/@tanstack/query-db-collection@1120

@tanstack/react-db

npm i https://pkg.pr.new/@tanstack/react-db@1120

@tanstack/rxdb-db-collection

npm i https://pkg.pr.new/@tanstack/rxdb-db-collection@1120

@tanstack/solid-db

npm i https://pkg.pr.new/@tanstack/solid-db@1120

@tanstack/svelte-db

npm i https://pkg.pr.new/@tanstack/svelte-db@1120

@tanstack/trailbase-db-collection

npm i https://pkg.pr.new/@tanstack/trailbase-db-collection@1120

@tanstack/vue-db

npm i https://pkg.pr.new/@tanstack/vue-db@1120

commit: 51782b6

@github-actions
Copy link
Contributor

github-actions bot commented Jan 12, 2026

Size Change: -57 B (-0.06%)

Total Size: 90.5 kB

Filename Size Change
./packages/db/dist/esm/query/compiler/group-by.js 1.81 kB -57 B (-3.04%)
ℹ️ View Unchanged
Filename Size
./packages/db/dist/esm/collection/change-events.js 1.39 kB
./packages/db/dist/esm/collection/changes.js 1.19 kB
./packages/db/dist/esm/collection/events.js 388 B
./packages/db/dist/esm/collection/index.js 3.32 kB
./packages/db/dist/esm/collection/indexes.js 1.1 kB
./packages/db/dist/esm/collection/lifecycle.js 1.67 kB
./packages/db/dist/esm/collection/mutations.js 2.34 kB
./packages/db/dist/esm/collection/state.js 3.46 kB
./packages/db/dist/esm/collection/subscription.js 3.62 kB
./packages/db/dist/esm/collection/sync.js 2.38 kB
./packages/db/dist/esm/deferred.js 207 B
./packages/db/dist/esm/errors.js 4.49 kB
./packages/db/dist/esm/event-emitter.js 748 B
./packages/db/dist/esm/index.js 2.69 kB
./packages/db/dist/esm/indexes/auto-index.js 742 B
./packages/db/dist/esm/indexes/base-index.js 766 B
./packages/db/dist/esm/indexes/btree-index.js 1.93 kB
./packages/db/dist/esm/indexes/lazy-index.js 1.1 kB
./packages/db/dist/esm/indexes/reverse-index.js 513 B
./packages/db/dist/esm/local-only.js 837 B
./packages/db/dist/esm/local-storage.js 2.1 kB
./packages/db/dist/esm/optimistic-action.js 359 B
./packages/db/dist/esm/paced-mutations.js 496 B
./packages/db/dist/esm/proxy.js 3.75 kB
./packages/db/dist/esm/query/builder/functions.js 733 B
./packages/db/dist/esm/query/builder/index.js 4.08 kB
./packages/db/dist/esm/query/builder/ref-proxy.js 1.05 kB
./packages/db/dist/esm/query/compiler/evaluators.js 1.42 kB
./packages/db/dist/esm/query/compiler/expressions.js 430 B
./packages/db/dist/esm/query/compiler/index.js 1.96 kB
./packages/db/dist/esm/query/compiler/joins.js 2 kB
./packages/db/dist/esm/query/compiler/order-by.js 1.45 kB
./packages/db/dist/esm/query/compiler/select.js 1.06 kB
./packages/db/dist/esm/query/expression-helpers.js 1.43 kB
./packages/db/dist/esm/query/ir.js 673 B
./packages/db/dist/esm/query/live-query-collection.js 360 B
./packages/db/dist/esm/query/live/collection-config-builder.js 5.4 kB
./packages/db/dist/esm/query/live/collection-registry.js 264 B
./packages/db/dist/esm/query/live/collection-subscriber.js 1.93 kB
./packages/db/dist/esm/query/live/internal.js 145 B
./packages/db/dist/esm/query/optimizer.js 2.56 kB
./packages/db/dist/esm/query/predicate-utils.js 2.97 kB
./packages/db/dist/esm/query/subset-dedupe.js 921 B
./packages/db/dist/esm/scheduler.js 1.3 kB
./packages/db/dist/esm/SortedMap.js 1.3 kB
./packages/db/dist/esm/strategies/debounceStrategy.js 247 B
./packages/db/dist/esm/strategies/queueStrategy.js 428 B
./packages/db/dist/esm/strategies/throttleStrategy.js 246 B
./packages/db/dist/esm/transactions.js 2.9 kB
./packages/db/dist/esm/utils.js 924 B
./packages/db/dist/esm/utils/browser-polyfills.js 304 B
./packages/db/dist/esm/utils/btree.js 5.61 kB
./packages/db/dist/esm/utils/comparison.js 852 B
./packages/db/dist/esm/utils/cursor.js 457 B
./packages/db/dist/esm/utils/index-optimization.js 1.51 kB
./packages/db/dist/esm/utils/type-guards.js 157 B

compressed-size-action::db-package-size

@github-actions
Copy link
Contributor

github-actions bot commented Jan 12, 2026

Size Change: 0 B

Total Size: 3.47 kB

ℹ️ View Unchanged
Filename Size
./packages/react-db/dist/esm/index.js 225 B
./packages/react-db/dist/esm/useLiveInfiniteQuery.js 1.17 kB
./packages/react-db/dist/esm/useLiveQuery.js 1.12 kB
./packages/react-db/dist/esm/useLiveSuspenseQuery.js 559 B
./packages/react-db/dist/esm/usePacedMutations.js 401 B

compressed-size-action::react-db-package-size

- Flatten nested ternary in valueExtractor for readability
- Remove dead validation code in replaceAggregatesByRefs ref case
- Condense docstring to reflect actual behavior

Co-Authored-By: Claude Opus 4.5 <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: Ready for review

Development

Successfully merging this pull request may close these issues.

4 participants