Skip to content

Commit

Permalink
fixes #29
Browse files Browse the repository at this point in the history
  • Loading branch information
koskimas committed Dec 6, 2021
1 parent 9135c00 commit e609902
Show file tree
Hide file tree
Showing 11 changed files with 71 additions and 17 deletions.
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "kysely",
"version": "0.10.0",
"version": "0.10.1",
"description": "Type safe SQL query builder",
"repository": {
"type": "git",
Expand Down
12 changes: 5 additions & 7 deletions src/driver/runtime-driver.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { CompiledQuery } from '../query-compiler/compiled-query.js'
import { Log } from '../util/log.js'
import { performanceNow } from '../util/performance-now.js'
import { DatabaseConnection, QueryResult } from './database-connection.js'
import { Driver, TransactionSettings } from './driver.js'

Expand Down Expand Up @@ -101,7 +102,7 @@ class RuntimeConnection implements DatabaseConnection {
}

async executeQuery<R>(compiledQuery: CompiledQuery): Promise<QueryResult<R>> {
const startTime = process.hrtime.bigint()
const startTime = performanceNow()

try {
return await this.#connection.executeQuery<R>(compiledQuery)
Expand All @@ -120,18 +121,15 @@ class RuntimeConnection implements DatabaseConnection {
}))
}

#logQuery(compiledQuery: CompiledQuery, startTime: bigint): void {
#logQuery(compiledQuery: CompiledQuery, startTime: number): void {
this.#log.query(() => ({
level: 'query',
sql: compiledQuery.sql,
queryDurationMillis: this.#calculateDurationMillis(startTime),
}))
}

#calculateDurationMillis(startTime: bigint): number {
const endTime = process.hrtime.bigint()
const durationNanos = Number(endTime - startTime)

return durationNanos / 1_000_000
#calculateDurationMillis(startTime: number): number {
return performanceNow() - startTime
}
}
3 changes: 2 additions & 1 deletion src/operation-node/column-definition-node.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import { freeze } from '../util/object-utils.js'
import { CheckConstraintNode } from './check-constraint-node.js'
import { ColumnNode } from './column-node.js'
import { DataTypeNode } from './data-type-node.js'
import { DefaultValueNode } from './default-to-node.js'
import { GeneratedAlwaysAsNode } from './generated-always-as-node.js'
import { OperationNode } from './operation-node.js'
import { RawNode } from './raw-node.js'
Expand All @@ -23,7 +24,7 @@ export interface ColumnDefinitionNode extends OperationNode {
readonly autoIncrement: boolean
readonly unique: boolean
readonly nullable: boolean
readonly defaultTo?: ValueNode | RawNode
readonly defaultTo?: DefaultValueNode
readonly check?: CheckConstraintNode
readonly generatedAlwaysAs?: GeneratedAlwaysAsNode
}
Expand Down
25 changes: 25 additions & 0 deletions src/operation-node/default-to-node.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
import { freeze } from '../util/object-utils.js'
import { OperationNode } from './operation-node.js'
import { RawNode } from './raw-node.js'
import { ValueNode } from './value-node.js'

export interface DefaultValueNode extends OperationNode {
readonly kind: 'DefaultValueNode'
readonly defaultValue: ValueNode | RawNode
}

/**
* @internal
*/
export const DefaultValueNode = freeze({
is(node: OperationNode): node is DefaultValueNode {
return node.kind === 'DefaultValueNode'
},

create(defaultValue: ValueNode | RawNode): DefaultValueNode {
return freeze({
kind: 'DefaultValueNode',
defaultValue,
})
},
})
13 changes: 11 additions & 2 deletions src/operation-node/operation-node-transformer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@ import { UnionNode } from './union-node.js'
import { CreateViewNode } from './create-view-node.js'
import { DropViewNode } from './drop-view-node.js'
import { GeneratedAlwaysAsNode } from './generated-always-as-node.js'
import { DefaultValueNode } from './default-to-node.js'

/**
* Transforms an operation node tree into another one.
Expand Down Expand Up @@ -95,7 +96,7 @@ import { GeneratedAlwaysAsNode } from './generated-always-as-node.js'
export class OperationNodeTransformer {
protected readonly nodeStack: OperationNode[] = []

readonly #transformers: Record<OperationNodeKind, Function> = {
readonly #transformers: Record<OperationNodeKind, Function> = freeze({
AliasNode: this.transformAlias.bind(this),
ColumnNode: this.transformColumn.bind(this),
IdentifierNode: this.transformIdentifier.bind(this),
Expand Down Expand Up @@ -158,7 +159,8 @@ export class OperationNodeTransformer {
CreateViewNode: this.transformCreateView.bind(this),
DropViewNode: this.transformDropView.bind(this),
GeneratedAlwaysAsNode: this.transformGeneratedAlwaysAs.bind(this),
}
DefaultValueNode: this.transformDefaultValue.bind(this),
})

readonly transformNode = <T extends OperationNode | undefined>(
node: OperationNode | undefined
Expand Down Expand Up @@ -693,6 +695,13 @@ export class OperationNodeTransformer {
}
}

protected transformDefaultValue(node: DefaultValueNode): DefaultValueNode {
return {
kind: 'DefaultValueNode',
defaultValue: this.transformNode(node.defaultValue),
}
}

protected transformDataType(node: DataTypeNode): DataTypeNode {
// An Object.freezed leaf node. No need to clone.
return node
Expand Down
8 changes: 6 additions & 2 deletions src/operation-node/operation-node-visitor.ts
Original file line number Diff line number Diff line change
Expand Up @@ -64,11 +64,13 @@ import { UnionNode } from './union-node.js'
import { CreateViewNode } from './create-view-node.js'
import { DropViewNode } from './drop-view-node.js'
import { GeneratedAlwaysAsNode } from './generated-always-as-node.js'
import { DefaultValueNode } from './default-to-node.js'
import { freeze } from '../util/object-utils.js'

export abstract class OperationNodeVisitor {
protected readonly nodeStack: OperationNode[] = []

readonly #visitors: Record<OperationNodeKind, Function> = {
readonly #visitors: Record<OperationNodeKind, Function> = freeze({
AliasNode: this.visitAlias.bind(this),
ColumnNode: this.visitColumn.bind(this),
IdentifierNode: this.visitIdentifier.bind(this),
Expand Down Expand Up @@ -131,7 +133,8 @@ export abstract class OperationNodeVisitor {
CreateViewNode: this.visitCreateView.bind(this),
DropViewNode: this.visitDropView.bind(this),
GeneratedAlwaysAsNode: this.visitGeneratedAlwaysAs.bind(this),
}
DefaultValueNode: this.visitDefaultValue.bind(this),
})

protected readonly visitNode = (node: OperationNode): void => {
this.nodeStack.push(node)
Expand Down Expand Up @@ -207,4 +210,5 @@ export abstract class OperationNodeVisitor {
protected abstract visitCreateView(node: CreateViewNode): void
protected abstract visitDropView(node: DropViewNode): void
protected abstract visitGeneratedAlwaysAs(node: GeneratedAlwaysAsNode): void
protected abstract visitDefaultValue(node: DefaultValueNode): void
}
1 change: 1 addition & 0 deletions src/operation-node/operation-node.ts
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@ export type OperationNodeKind =
| 'CreateViewNode'
| 'DropViewNode'
| 'GeneratedAlwaysAsNode'
| 'DefaultValueNode'

export interface OperationNode {
readonly kind: OperationNodeKind
Expand Down
10 changes: 8 additions & 2 deletions src/query-compiler/default-query-compiler.ts
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,7 @@ import { UnionNode } from '../operation-node/union-node.js'
import { CreateViewNode } from '../operation-node/create-view-node.js'
import { DropViewNode } from '../operation-node/drop-view-node.js'
import { GeneratedAlwaysAsNode } from '../operation-node/generated-always-as-node.js'
import { DefaultValueNode } from '../operation-node/default-to-node.js'

export class DefaultQueryCompiler
extends OperationNodeVisitor
Expand Down Expand Up @@ -472,7 +473,7 @@ export class DefaultQueryCompiler
}

if (node.defaultTo) {
this.append(' default ')
this.append(' ')
this.visitNode(node.defaultTo)
}

Expand Down Expand Up @@ -960,7 +961,7 @@ export class DefaultQueryCompiler
this.visitNode(node.name)
}

protected visitGeneratedAlwaysAs(node: GeneratedAlwaysAsNode): void {
protected override visitGeneratedAlwaysAs(node: GeneratedAlwaysAsNode): void {
this.append('generated always as (')
this.visitNode(node.expression)
this.append(')')
Expand All @@ -970,6 +971,11 @@ export class DefaultQueryCompiler
}
}

protected override visitDefaultValue(node: DefaultValueNode): void {
this.append('default ')
this.visitNode(node.defaultValue)
}

protected append(str: string): void {
this.#sql += str
}
Expand Down
2 changes: 1 addition & 1 deletion src/raw-builder/raw-builder.ts
Original file line number Diff line number Diff line change
Expand Up @@ -141,5 +141,5 @@ export interface RawBuilderProps {
readonly queryId: QueryId
readonly executor: QueryExecutor
readonly sql: string
readonly parameters?: any
readonly parameters?: ReadonlyArray<unknown>
}
3 changes: 2 additions & 1 deletion src/schema/column-definition-builder.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import {
parseDefaultValueExpression,
} from '../parser/default-value-parser.js'
import { GeneratedAlwaysAsNode } from '../operation-node/generated-always-as-node.js'
import { DefaultValueNode } from '../operation-node/default-to-node.js'

export interface ColumnDefinitionBuilderInterface<R> {
/**
Expand Down Expand Up @@ -228,7 +229,7 @@ export class ColumnDefinitionBuilder
defaultTo(value: DefaultValueExpression): ColumnDefinitionBuilder {
return new ColumnDefinitionBuilder(
ColumnDefinitionNode.cloneWith(this.#node, {
defaultTo: parseDefaultValueExpression(value),
defaultTo: DefaultValueNode.create(parseDefaultValueExpression(value)),
})
)
}
Expand Down
9 changes: 9 additions & 0 deletions src/util/performance-now.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import { isFunction } from './object-utils.js'

export function performanceNow() {
if (typeof performance !== 'undefined' && isFunction(performance.now)) {
return performance.now()
} else {
return Date.now()
}
}

0 comments on commit e609902

Please sign in to comment.