Where
The Where
type describes a function that lets you specify conditions to filter results, based on the underlying Cells of the root or joined Tables
.
Calling this function with two parameters is used to include only those Rows for which a specified Cell
in the query's root Table
has a specified value.
(
cellId: string,
equals: Cell,
): void
Type | Description | |
---|---|---|
cellId | string | |
equals | Cell | The value that the |
returns | void | This has no return value. |
Since
v2.0.0
Calling this function with three parameters is used to include only those Rows for which a specified Cell
in a joined Table
has a specified value.
(
joinedTableId: string,
joinedCellId: string,
equals: Cell,
): void
Type | Description | |
---|---|---|
joinedTableId | string | The |
joinedCellId | string | |
equals | Cell | The value that the |
returns | void | This has no return value. |
Since
v2.0.0
Calling this function with one callback parameter is used to include only those Rows which meet a calculated boolean condition, based on values in the main and (optionally) joined Tables
.
(condition: (getTableCell: GetTableCell) => boolean): void
Type | Description | |
---|---|---|
condition | (getTableCell: GetTableCell) => boolean | A callback that takes a |
returns | void | This has no return value. |
Since
v2.0.0
The Where
function is provided to the third query
parameter of the setQueryDefinition
method.
If you do not specify a Where
clause, you should expect every non-empty Row
of the root Table
to appear in the query's results.
A Where
condition has to be true for a Row
to be included in the results. Each Where
class is additive, as though combined with a logical 'and'. If you wish to create an 'or' expression, use the single parameter version of the type that allows arbitrary programmatic conditions.
The Where
keyword differs from the Having
keyword in that the former describes conditions that should be met by underlying Cell
values (whether selected or not), and the latter describes conditions based on calculated and aggregated values - after Group
clauses have been applied.
Examples
This example shows a query that filters the results from a single Table
by comparing an underlying Cell
from it with a value.
import {createQueries, createStore} from 'tinybase';
const store = createStore().setTable('pets', {
fido: {species: 'dog'},
felix: {species: 'cat'},
cujo: {species: 'dog'},
});
const queries = createQueries(store);
queries.setQueryDefinition('query', 'pets', ({select, where}) => {
select('species');
where('species', 'dog');
});
queries.forEachResultRow('query', (rowId) => {
console.log({[rowId]: queries.getResultRow('query', rowId)});
});
// -> {fido: {species: 'dog'}}
// -> {cujo: {species: 'dog'}}
This example shows a query that filters the results of a query by comparing an underlying Cell
from a joined Table
with a value. Note that the joined table has also been aliased, and so its alias is used in the Where
clause.
import {createQueries, createStore} from 'tinybase';
const store = createStore()
.setTable('pets', {
fido: {species: 'dog', ownerId: '1'},
felix: {species: 'cat', ownerId: '2'},
cujo: {species: 'dog', ownerId: '3'},
})
.setTable('owners', {
'1': {name: 'Alice', state: 'CA'},
'2': {name: 'Bob', state: 'CA'},
'3': {name: 'Carol', state: 'WA'},
});
const queries = createQueries(store);
queries.setQueryDefinition('query', 'pets', ({select, join, where}) => {
select('species');
// from pets
join('owners', 'ownerId').as('petOwners');
where('petOwners', 'state', 'CA');
});
queries.forEachResultRow('query', (rowId) => {
console.log({[rowId]: queries.getResultRow('query', rowId)});
});
// -> {fido: {species: 'dog'}}
// -> {felix: {species: 'cat'}}
This example shows a query that filters the results of a query with a condition that is calculated from underlying Cell
values from the main and joined Table
. Note that the joined table has also been aliased, and so its alias is used in the Where
clause.
import {createQueries, createStore} from 'tinybase';
const store = createStore()
.setTable('pets', {
fido: {species: 'dog', ownerId: '1'},
felix: {species: 'cat', ownerId: '2'},
cujo: {species: 'dog', ownerId: '3'},
})
.setTable('owners', {
'1': {name: 'Alice', state: 'CA'},
'2': {name: 'Bob', state: 'CA'},
'3': {name: 'Carol', state: 'WA'},
});
const queries = createQueries(store);
queries.setQueryDefinition('query', 'pets', ({select, join, where}) => {
select('species');
select('petOwners', 'state');
// from pets
join('owners', 'ownerId').as('petOwners');
where(
(getTableCell) =>
getTableCell('pets', 'species') === 'cat' ||
getTableCell('petOwners', 'state') === 'WA',
);
});
queries.forEachResultRow('query', (rowId) => {
console.log({[rowId]: queries.getResultRow('query', rowId)});
});
// -> {felix: {species: 'cat', state: 'CA'}}
// -> {cujo: {species: 'dog', state: 'WA'}}
Since
v2.0.0