Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ const results = await db.select().from(usersTable).where(where);
import { bigqueryFilter } from "@filter-def/bigquery";
import { BigQuery } from "@google-cloud/bigquery";

const userFilter = bigqueryFilter<User>("myproject.dataset.users").def({
const userFilter = bigqueryFilter<User>().def({
name: { kind: "eq" },
emailContains: { kind: "contains", field: "email" },
minAge: { kind: "gte", field: "age" },
Expand Down Expand Up @@ -178,7 +178,7 @@ const filter = drizzleFilter(usersTable).def({
**BigQuery** (parameterized SQL):

```typescript
const filter = bigqueryFilter<User>("dataset.users").def({
const filter = bigqueryFilter<User>().def({
ageDivisibleBy: (divisor: number) => ({
sql: "MOD(age, @divisor) = 0",
params: { divisor },
Expand Down
70 changes: 34 additions & 36 deletions packages/bigquery/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ interface User {
}

// Create a filter definition
const userFilter = bigqueryFilter<User>("myproject.dataset.users").def({
const userFilter = bigqueryFilter<User>().def({
name: { kind: "eq" },
emailContains: { kind: "contains", field: "email" },
minAge: { kind: "gte", field: "age" },
Expand Down Expand Up @@ -67,7 +67,7 @@ const [rows] = await bigquery.query({
Creates a filter builder for the specified entity type.

```typescript
const productFilter = bigqueryFilter<Product>("project.dataset.products").def({
const productFilter = bigqueryFilter<Product>().def({
// Filter definitions...
});
```
Expand Down Expand Up @@ -109,7 +109,7 @@ const noInput = userFilter();
When the filter name matches a column name, the `field` property is inferred:

```typescript
const filter = bigqueryFilter<User>("dataset.users").def({
const filter = bigqueryFilter<User>().def({
name: { kind: "eq" }, // field: "name" inferred
email: { kind: "contains" }, // field: "email" inferred
minAge: { kind: "gte", field: "age" }, // explicit field required
Expand All @@ -126,7 +126,7 @@ interface UserWithAddress {
address: { city: string; geo: { lat: number; lng: number } };
}

const userFilter = bigqueryFilter<UserWithAddress>("dataset.users").def({
const userFilter = bigqueryFilter<UserWithAddress>().def({
firstName: { kind: "eq", field: "name.first" },
lat: { kind: "eq", field: "address.geo.lat" },
});
Expand All @@ -145,7 +145,7 @@ Dots in the field path are used directly as the column reference, and parameter
Use `caseInsensitive: true` to use `LOWER()` for case-insensitive matching:

```typescript
const filter = bigqueryFilter<User>("dataset.users").def({
const filter = bigqueryFilter<User>().def({
nameSearch: {
kind: "contains",
field: "name",
Expand All @@ -159,7 +159,7 @@ const filter = bigqueryFilter<User>("dataset.users").def({
Combine conditions with logical operators. All conditions must have explicit `field` properties.

```typescript
const filter = bigqueryFilter<User>("dataset.users").def({
const filter = bigqueryFilter<User>().def({
// OR: match any condition
searchTerm: {
kind: "or",
Expand Down Expand Up @@ -192,7 +192,7 @@ Custom filters receive the input value and return a `BigQueryFilterResult`:
```typescript
import type { BigQueryFilterResult } from "@filter-def/bigquery";

const userFilter = bigqueryFilter<User>("dataset.users").def({
const userFilter = bigqueryFilter<User>().def({
// Custom SQL expression
ageDivisibleBy: (divisor: number): BigQueryFilterResult => ({
sql: "MOD(age, @divisor) = 0",
Expand Down Expand Up @@ -222,7 +222,7 @@ Extract the input type from a filter definition:
```typescript
import type { BigQueryFilterInput } from "@filter-def/bigquery";

const userFilter = bigqueryFilter<User>("dataset.users").def({
const userFilter = bigqueryFilter<User>().def({
name: { kind: "eq" },
minAge: { kind: "gte", field: "age" },
});
Expand Down Expand Up @@ -283,33 +283,31 @@ interface Product {
}

// Filter definition
const productFilter = bigqueryFilter<Product>("myproject.dataset.products").def(
{
// Inferred fields
name: { kind: "eq" },
category: { kind: "eq" },
inStock: { kind: "eq" },

// Explicit fields
nameContains: {
kind: "contains",
field: "name",
caseInsensitive: true,
},
minPrice: { kind: "gte", field: "price" },
maxPrice: { kind: "lte", field: "price" },
inCategories: { kind: "inArray", field: "category" },

// Boolean filter for search
search: {
kind: "or",
conditions: [
{ kind: "contains", field: "name" },
{ kind: "contains", field: "description" },
],
},
const productFilter = bigqueryFilter<Product>().def({
// Inferred fields
name: { kind: "eq" },
category: { kind: "eq" },
inStock: { kind: "eq" },

// Explicit fields
nameContains: {
kind: "contains",
field: "name",
caseInsensitive: true,
},
);
minPrice: { kind: "gte", field: "price" },
maxPrice: { kind: "lte", field: "price" },
inCategories: { kind: "inArray", field: "category" },

// Boolean filter for search
search: {
kind: "or",
conditions: [
{ kind: "contains", field: "name" },
{ kind: "contains", field: "description" },
],
},
});

type ProductFilterInput = BigQueryFilterInput<typeof productFilter>;

Expand Down Expand Up @@ -349,7 +347,7 @@ const searchResults = await searchProducts(bigquery, {
BigQuery uses `UNNEST()` for array parameters in `IN` clauses:

```typescript
const filter = bigqueryFilter<User>("dataset.users").def({
const filter = bigqueryFilter<User>().def({
ageIn: { kind: "inArray", field: "age" },
});

Expand All @@ -363,7 +361,7 @@ const where = filter({ ageIn: [25, 30, 35] });
BigQuery expects timestamps in ISO format. Use custom filters for date handling:

```typescript
const filter = bigqueryFilter<Event>("dataset.events").def({
const filter = bigqueryFilter<Event>().def({
after: (date: Date) => ({
sql: "timestamp > @after",
params: { after: date.toISOString() },
Expand Down
6 changes: 3 additions & 3 deletions packages/bigquery/src/bigquery-filter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ import type {
* age: number;
* }
*
* const userFilter = bigqueryFilter<User>('myproject.dataset.users').def({
* const userFilter = bigqueryFilter<User>().def({
* name: { kind: 'eq' },
* emailContains: { kind: 'contains', field: 'email' },
* });
Expand All @@ -47,7 +47,7 @@ import type {
* Custom filters can return SQL and params directly:
*
* ```typescript
* const userFilter = bigqueryFilter<User>('myproject.dataset.users').def({
* const userFilter = bigqueryFilter<User>().def({
* ageDivisibleBy: (divisor: number) => ({
* sql: 'MOD(age, @divisor) = 0',
* params: { divisor },
Expand Down Expand Up @@ -89,7 +89,7 @@ export type BigQueryFilter<TFilterInput> = (
* The expected input for a BigQueryFilter.
*
* ```typescript
* const userFilter = bigqueryFilter<User>('table').def({ ... });
* const userFilter = bigqueryFilter<User>().def({ ... });
* type UserFilterInput = BigQueryFilterInput<typeof userFilter>;
* ```
*/
Expand Down