dbay
Version:
In-Process, In-Memory & File-Based Relational Data Processing with SQLite, BetterSQLite3
167 lines (139 loc) • 9.36 kB
text/coffeescript
'use strict'
############################################################################################################
Intertype = ( require 'intertype' ).Intertype
intertype = new Intertype module.exports
#-----------------------------------------------------------------------------------------------------------
@declare 'dbay_schema', ( x ) ->
### NOTE to keep things simple, only allow lower case ASCII letters, digits, underscores in schemas ###
return false unless @isa.text x
return ( /^[a-z_][a-z0-9_]*$/ ).test x
#-----------------------------------------------------------------------------------------------------------
@declare 'dbay_usr_schema', ( x ) -> ( @isa.dbay_schema x ) and ( x not in [ 'main', 'temp', ] )
@declare 'dbay_path', ( x ) -> @isa.text x
@declare 'dbay_name', ( x ) -> @isa.nonempty_text x
#-----------------------------------------------------------------------------------------------------------
@declare 'constructor_cfg', tests:
"@isa.object x": ( x ) -> @isa.object x
"@isa.nonempty_text x.path": ( x ) -> @isa.nonempty_text x.path
"@isa.boolean x.temporary": ( x ) -> @isa.boolean x.temporary
# "@isa.boolean x.create_stdlib": ( x ) -> @isa.boolean x.create_stdlib
"x.random_seed may be set": ( x ) -> true
"x.random_delta may be set": ( x ) -> true
"@isa.boolean x.macros": ( x ) -> @isa.boolean x.macros
"@isa.dbay_journal_mode x.journal_mode": ( x ) -> @isa.dbay_journal_mode x.journal_mode
#-----------------------------------------------------------------------------------------------------------
@declare 'dbay_with_transaction_cfg', tests:
"@isa.object x": ( x ) -> @isa.object x
"x.mode in [ 'deferred', 'immediate', 'exclusive', ]": \
( x ) -> x.mode in [ 'deferred', 'immediate', 'exclusive', ]
#-----------------------------------------------------------------------------------------------------------
@declare 'dbay_open_cfg', tests:
"@isa.object x": ( x ) -> @isa.object x
"@isa.dbay_usr_schema x.schema": ( x ) -> @isa.dbay_usr_schema x.schema
"@isa_optional.dbay_path x.path": ( x ) -> @isa_optional.dbay_path x.path
"@isa.boolean x.temporary": ( x ) -> @isa.boolean x.temporary
# "@isa.boolean x.overwrite": ( x ) -> @isa.boolean x.overwrite
# "@isa.boolean x.create": ( x ) -> @isa.boolean x.create
#-----------------------------------------------------------------------------------------------------------
@declare 'dbay_journal_mode', tests:
"x in [ 'delete', 'wal', 'truncate', 'persist', 'memory', 'wal', 'off', ]": \
( x ) -> x in [ 'delete', 'wal', 'truncate', 'persist', 'memory', 'wal', 'off', ]
#===========================================================================================================
# UDF
#-----------------------------------------------------------------------------------------------------------
@declare 'dbay_create_function_cfg', tests:
"@isa.object x": ( x ) -> @isa.object x
"@isa.nonempty_text x.name": ( x ) -> @isa.nonempty_text x.name
"@isa.function x.call": ( x ) -> @isa.function x.call
"@isa.boolean x.deterministic": ( x ) -> @isa.boolean x.deterministic
"@isa.boolean x.varargs": ( x ) -> @isa.boolean x.varargs
"@isa.boolean x.directOnly": ( x ) -> @isa.boolean x.directOnly
#-----------------------------------------------------------------------------------------------------------
@declare 'dbay_create_aggregate_function_cfg', tests:
"@isa.object x": ( x ) -> @isa.object x
"@isa.nonempty_text x.name": ( x ) -> @isa.nonempty_text x.name
# "@isa.any x.start": ( x ) -> @isa.any x.start
"@isa.function x.step": ( x ) -> @isa.function x.step
"@isa.boolean x.deterministic": ( x ) -> @isa.boolean x.deterministic
"@isa.boolean x.varargs": ( x ) -> @isa.boolean x.varargs
"@isa.boolean x.directOnly": ( x ) -> @isa.boolean x.directOnly
#-----------------------------------------------------------------------------------------------------------
@declare 'dbay_create_window_function_cfg', tests:
"@isa.object x": ( x ) -> @isa.object x
"@isa.nonempty_text x.name": ( x ) -> @isa.nonempty_text x.name
# "@isa.any x.start": ( x ) -> @isa.any x.start
"@isa.function x.step": ( x ) -> @isa.function x.step
"@isa.function x.inverse": ( x ) -> @isa.function x.inverse
"@isa_optional.function x.result": ( x ) -> @isa_optional.function x.result
"@isa.boolean x.deterministic": ( x ) -> @isa.boolean x.deterministic
"@isa.boolean x.varargs": ( x ) -> @isa.boolean x.varargs
"@isa.boolean x.directOnly": ( x ) -> @isa.boolean x.directOnly
#-----------------------------------------------------------------------------------------------------------
@declare 'dbay_create_table_function_cfg', tests:
"@isa.object x": ( x ) -> @isa.object x
"@isa.nonempty_text x.name": ( x ) -> @isa.nonempty_text x.name
"@isa_optional.list x.columns": ( x ) -> @isa_optional.list x.columns
"@isa_optional.list x.parameters": ( x ) -> @isa_optional.list x.parameters
"@isa.generatorfunction x.rows": ( x ) -> @isa.generatorfunction x.rows
"@isa.boolean x.deterministic": ( x ) -> @isa.boolean x.deterministic
"@isa.boolean x.varargs": ( x ) -> @isa.boolean x.varargs
"@isa.boolean x.directOnly": ( x ) -> @isa.boolean x.directOnly
#-----------------------------------------------------------------------------------------------------------
@declare 'dbay_create_virtual_table_cfg', tests:
"@isa.object x": ( x ) -> @isa.object x
"@isa.nonempty_text x.name": ( x ) -> @isa.nonempty_text x.name
"@isa.function x.create": ( x ) -> @isa.function x.create
#-----------------------------------------------------------------------------------------------------------
@declare 'dbay_execute_file_cfg', tests:
"@isa.object x": ( x ) -> @isa.object x
"@isa.nonempty_text x.path": ( x ) -> @isa.nonempty_text x.path
"@isa.nonempty_text x.encoding": ( x ) -> @isa.nonempty_text x.encoding
#===========================================================================================================
# SQLGEN
#-----------------------------------------------------------------------------------------------------------
@declare 'dbay_create_insert_on_conflict_cfg', ( x ) ->
#-----------------------------------------------------------------------------------------------------------
@declare 'dbay_create_insert_cfg', tests:
"@isa.object x": ( x ) -> @isa.object x
"@isa.dbay_schema x.schema": ( x ) -> @isa.dbay_schema x.schema
"@isa.dbay_name x.into": ( x ) -> @isa.dbay_name x.into
"@isa_optional.nonempty_text x.returning": ( x ) -> @isa_optional.nonempty_text x.returning
"x.on_conflict is an optional nonempty_text or suitable object": ( x ) ->
return true unless x.on_conflict?
return true if @isa.nonempty_text x.on_conflict
return false unless @isa.object x.on_conflict
return false unless x.on_conflict.update is true
return true
"either x.fields or x.exclude may be a nonempty list of nonempty_texts": ( x ) ->
if x.fields?
return false if x.exclude?
return false unless @isa.list x.fields
return false unless x.fields.length > 0
return false unless x.fields.every ( e ) => @isa.nonempty_text e
return true
if x.exclude?
return false unless @isa.list x.exclude
return false unless x.exclude.length > 0
return false unless x.exclude.every ( e ) => @isa.nonempty_text e
return true
return true
#===========================================================================================================
# DT
#-----------------------------------------------------------------------------------------------------------
@declare 'dbay_dt_valid_dayjs', tests:
"( @type_of x ) is 'm'": ( x ) -> ( @type_of x ) is 'm'
"@isa.float x.$y": ( x ) -> @isa.float x.$y
"@isa.float x.$M": ( x ) -> @isa.float x.$M
"@isa.float x.$D": ( x ) -> @isa.float x.$D
"@isa.float x.$W": ( x ) -> @isa.float x.$W
"@isa.float x.$H": ( x ) -> @isa.float x.$H
"@isa.float x.$m": ( x ) -> @isa.float x.$m
"@isa.float x.$s": ( x ) -> @isa.float x.$s
"@isa.float x.$ms": ( x ) -> @isa.float x.$ms
#-----------------------------------------------------------------------------------------------------------
@declare 'dbay_dt_timestamp', tests:
"@isa.text x": ( x ) -> @isa.text x
"( /^\\d{8}-\\d{6}Z$/ ).test x": ( x ) -> ( /^\d{8}-\d{6}Z$/ ).test x
#-----------------------------------------------------------------------------------------------------------
@declare 'dba_dt_now_cfg', tests:
"@isa.object x": ( x ) -> @isa.object x