Skip to content

Commit b89c2e3

Browse files
committed
feat(@sirutils/seql): added ability to generate cache keys
1 parent 4c091ae commit b89c2e3

15 files changed

+338
-191
lines changed

.gitignore

+2-1
Original file line numberDiff line numberDiff line change
@@ -139,4 +139,5 @@ lib/
139139
*.tsbuildinfo
140140

141141
# others
142-
experiments
142+
experiments
143+
.tmp

bun.lockb

-78.2 KB
Binary file not shown.

packages/seql/package.json

-2
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,10 @@
22
"name": "@sirutils/seql",
33
"version": "0.0.1",
44
"type": "module",
5-
65
"main": "dist/index.js",
76
"module": "dist/index.js",
87
"files": ["dist", "definitions"],
98
"types": "dist/index.d.ts",
10-
119
"devDependencies": {
1210
"@sirutils/builder": "workspace:*"
1311
},

packages/seql/src/definitions/seql.ts

+10-6
Original file line numberDiff line numberDiff line change
@@ -13,25 +13,29 @@ declare global {
1313
namespace Seql {
1414
export type ValueRecord<T = BlobType> = Record<string, T>
1515

16-
export interface Query<T = BlobType> {
16+
export interface QueryBuilder<T = BlobType> {
1717
$type: symbol
18-
text: string
19-
values: T[]
18+
entries: [string | null, T, boolean][]
19+
cacheKeys: string[]
20+
operations: symbol[]
2021

21-
builder: BuildedQuery<T>
22+
buildText(nextParamID: number): string
2223
}
2324

24-
export interface BuildedQuery<T = BlobType> {
25+
export interface Query<T = BlobType> {
2526
$type: symbol
27+
text: string
2628
values: T[]
27-
buildText(nextParamID: number): string
29+
30+
builder: Sirutils.Seql.QueryBuilder<T>
2831
}
2932

3033
export interface AdapterOptions {
3134
paramterPattern: (str: string) => string
3235
}
3336

3437
export interface Env {
38+
console: 'silent' | 'normal'
3539
adapter: 'mysql' | 'postgres'
3640
}
3741
}

packages/seql/src/index.ts

+5-6
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,20 @@
11
import './definitions'
22

3-
import { buildAll, query } from './seql'
3+
export * from './tag'
4+
5+
import { query } from './seql'
46

57
// biome-ignore lint/style/noNamespaceImport: For re-export as Seql
68
import * as builder from './utils/builder'
79
// biome-ignore lint/style/noNamespaceImport: For re-export as Seql
8-
import * as common from './utils/common'
10+
import * as generater from './utils/generater'
911
// biome-ignore lint/style/noNamespaceImport: For re-export as Seql
1012
import * as operations from './utils/operations'
1113

12-
export * from './tag'
13-
1414
export const Seql = {
1515
query,
16-
buildAll,
1716

1817
...builder,
19-
...common,
18+
...generater,
2019
...operations,
2120
}

packages/seql/src/internal/consts.ts

+10-2
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,16 @@ import { extractEnvs, unwrap } from '@sirutils/core'
33
export const ENV = unwrap(
44
extractEnvs<Sirutils.Seql.Env>(env => ({
55
adapter: env.SEQL_ADAPTER || 'mysql',
6+
console: env.console || 'normal',
67
}))
78
)
89

9-
export const Raw = Symbol('Raw Query')
10-
export const Generated = Symbol('Generated Query')
10+
export const BUILDER = Symbol('Base Builder')
11+
export const GENERATED = Symbol('Generated Query')
12+
13+
export const AND = Symbol('AND')
14+
export const OR = Symbol('OR')
15+
export const INSERT = Symbol('INSERT')
16+
export const UPDATE = Symbol('UPDATE')
17+
18+
export const CACHEABLE_OPERATIONS = [AND, OR]

packages/seql/src/internal/logger.ts

+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import { ENV } from './consts'
2+
3+
// TODO: change to planned logger
4+
5+
export const logger = {
6+
warn: (...messages: unknown[]) => {
7+
if (ENV.console === 'silent') {
8+
return
9+
}
10+
11+
// biome-ignore lint/nursery/noConsole: Redundant
12+
console.warn(...messages)
13+
},
14+
}

packages/seql/src/internal/utils.ts

+45
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
import type { BlobType } from '@sirutils/core'
2+
3+
export const isObject = (value: BlobType): value is object =>
4+
typeof value === 'object' && !Array.isArray(value) && value !== null && !(value instanceof Date)
5+
6+
export const unique = (data: BlobType[]) => [...new Set(data)]
7+
8+
const objectKeys = (object: object): Set<string> => {
9+
return new Set(Object.keys(object))
10+
}
11+
12+
const areSetsEqual = <T>(set1: Set<T>, set2: Set<T>): boolean => {
13+
const difference = new Set(set1)
14+
for (const elem of set2) {
15+
if (difference.has(elem)) {
16+
difference.delete(elem)
17+
} else {
18+
return false
19+
}
20+
}
21+
22+
return difference.size === 0
23+
}
24+
25+
export const filterUndefined = <T extends Sirutils.Seql.ValueRecord>(object: T): T => {
26+
return Object.fromEntries(Object.entries(object).filter(([_, v]) => v !== undefined)) as T
27+
}
28+
29+
export const extractKeys = <T extends Sirutils.Seql.ValueRecord>(objects: T[]): string[] => {
30+
if (objects.length === 0) {
31+
throw new Error('Cannot call extractKeys on empty list')
32+
}
33+
34+
// biome-ignore lint/style/noNonNullAssertion: <explanation>
35+
const keys = objectKeys(objects[0]!)
36+
37+
for (const o of objects) {
38+
const oKeys = objectKeys(o)
39+
if (!areSetsEqual(keys, oKeys)) {
40+
throw new Error(`Objects have different keys: ${JSON.stringify(objects)}`)
41+
}
42+
}
43+
44+
return Array.from(keys)
45+
}

packages/seql/src/seql.ts

+4-21
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,11 @@
11
import type { BlobType } from '@sirutils/core'
22

3-
import { generate, join, raw, toSqlBuilder } from './utils/builder'
4-
import { mergeLists } from './utils/common'
3+
import { buildAll } from './utils/builder'
4+
import { generate } from './utils/generater'
55

66
/**
77
* Use this for creating queries
88
*/
9-
export const query = (texts: TemplateStringsArray, ...values: BlobType[]): Sirutils.Seql.Query => {
10-
const result = generate(buildAll(texts, ...values))
11-
12-
return result
13-
}
14-
15-
/**
16-
* Internal template string tag that builds all props.
17-
*/
18-
export const buildAll = (
19-
texts: TemplateStringsArray,
20-
...values: BlobType[]
21-
): Sirutils.Seql.BuildedQuery => {
22-
const textSqlBuilders = texts.map(raw)
23-
const valueSqlBuilders = values.map(toSqlBuilder)
24-
25-
const sqlBuilders = mergeLists(textSqlBuilders, valueSqlBuilders)
26-
27-
return join(sqlBuilders)
9+
export const query = (texts: TemplateStringsArray, ...values: BlobType[]) => {
10+
return generate(buildAll(texts, ...values))
2811
}

packages/seql/src/tag.ts

+1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ const createTag = tagBuilder('@sirutils/seql')
44

55
export const seqlTags = {
66
env: createTag('invalid-env'),
7+
cacheEvicted: createTag('cache-evicted'),
78
} as const
89

910
export type SeqlTags = (typeof seqlTags)[keyof typeof seqlTags]

0 commit comments

Comments
 (0)