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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
@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 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants