Skip to content

Conversation

@KyleAMathews
Copy link
Collaborator

@KyleAMathews KyleAMathews commented Jan 18, 2026

Summary

Add subtract, multiply, and divide math functions to enable computed columns in queries. This unlocks ranking algorithms and dynamic calculations directly in select and orderBy clauses without pre-computing values.

Approach

Extended the existing math function pattern established by add(). Each function:

  • Takes two numeric operands (field refs, literals, or nested expressions)
  • Returns a BasicExpression<number> with proper nullability inference via BinaryNumericReturnType
  • Compiles to the corresponding IR node for execution
// Functions follow the same pattern as add()
export function subtract<T1, T2>(left: T1, right: T2): BinaryNumericReturnType<T1, T2> {
  return new Func(`subtract`, [toExpression(left), toExpression(right)])
}

Key design choice: Functions can be nested for complex calculations:

// (salary * 1.1) - 500
subtract(multiply(employees.salary, 1.1), 500)

Key Invariants

  1. Type safety preserved — Nullability propagates correctly (if either operand can be null/undefined, result can be too)
  2. Composability — Functions nest arbitrarily without special handling
  3. Consistent pattern — All four arithmetic functions share identical structure with add()

Non-goals

  • Division by zero handling — Left to the runtime/backend (returns null per SQL semantics)
  • Operator syntax — No a + b syntax; explicit function calls keep the IR clean

Verification

pnpm test --filter @tanstack/db

Tests cover:

  • Each function individually (subtract, multiply, divide)
  • Nested composition (e.g., subtract(multiply(...), ...))
  • Usage in orderBy clauses

Files Changed

File Change
packages/db/src/query/builder/functions.ts Add subtract, multiply, divide functions
packages/db/src/query/index.ts Export new functions
packages/db/tests/query/builder/functions.test.ts Add tests for new functions
docs/guides/live-queries.md Document functions + computed orderBy example
.changeset/add-math-functions.md Changeset for release

🤖 Generated with Claude Code

Add missing math functions that were implemented in evaluators but not
exported. These enable computed columns in orderBy for ranking algorithms
like HN-style scoring that balances recency and rating.

- Add subtract(a, b) function
- Add multiply(a, b) function
- Add divide(a, b) function (with null on divide-by-zero)
- Export from query/index.ts
- Add to operators list
- Add comprehensive tests including orderBy usage
- Add documentation for new math functions in live-queries.md
- Include example of computed columns in orderBy for ranking algorithms
- Add changeset for the new minor feature
@changeset-bot
Copy link

changeset-bot bot commented Jan 18, 2026

🦋 Changeset detected

Latest commit: 287a1ff

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

This PR includes changesets to release 12 packages
Name Type
@tanstack/db 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 18, 2026

More templates

@tanstack/angular-db

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

@tanstack/db

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

@tanstack/db-ivm

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

@tanstack/electric-db-collection

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

@tanstack/offline-transactions

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

@tanstack/powersync-db-collection

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

@tanstack/query-db-collection

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

@tanstack/react-db

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

@tanstack/rxdb-db-collection

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

@tanstack/solid-db

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

@tanstack/svelte-db

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

@tanstack/trailbase-db-collection

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

@tanstack/vue-db

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

commit: 287a1ff

@github-actions
Copy link
Contributor

Size Change: +100 B (+0.11%)

Total Size: 90.6 kB

Filename Size Change
./packages/db/dist/esm/index.js 2.73 kB +40 B (+1.48%)
./packages/db/dist/esm/query/builder/functions.js 793 B +60 B (+8.19%) 🔍
ℹ️ 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/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/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/group-by.js 1.87 kB
./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

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

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