reactivedb
Advanced tools
Comparing version 0.9.3 to 0.9.4
@@ -9,3 +9,3 @@ import { ReactiveDBException } from './Exception'; | ||
export declare const UnexpectedRelationship: () => ReactiveDBException; | ||
export declare const InvalidType: (expect?: [string, string]) => ReactiveDBException; | ||
export declare const InvalidType: (expect?: [string, string] | undefined) => ReactiveDBException; | ||
export declare const PrimaryKeyNotProvided: () => ReactiveDBException; | ||
@@ -12,0 +12,0 @@ export declare const PrimaryKeyConflict: () => ReactiveDBException; |
import { ReactiveDBException } from './Exception'; | ||
export declare const TokenConsumed: () => ReactiveDBException; | ||
export declare const TokenConcatFailed: (msg?: string) => ReactiveDBException; | ||
export declare const TokenConcatFailed: (msg?: string | undefined) => ReactiveDBException; |
@@ -89,3 +89,3 @@ /// <reference types="lovefield" /> | ||
export interface UpsertContext { | ||
mapper: Function; | ||
mapper: Function | null; | ||
isNavigatorLeaf: boolean; | ||
@@ -119,3 +119,3 @@ visited: boolean; | ||
column: lf.schema.Column; | ||
orderBy: lf.Order; | ||
orderBy: lf.Order | null; | ||
} | ||
@@ -122,0 +122,0 @@ export interface LfFactoryInit { |
{ | ||
"name": "reactivedb", | ||
"version": "0.9.3", | ||
"version": "0.9.4", | ||
"description": "Reactive ORM for Lovefield", | ||
@@ -10,8 +10,8 @@ "main": "index.js", | ||
"build_module_es6": "npm-run-all clean_dist_es6 copy_src_es6 compile_module_es6", | ||
"build_test": "rm -rf spec-js && tsc test/run.ts -m commonjs --outDir spec-js --sourcemap --target ES2015 --diagnostics --pretty --noImplicitAny --noImplicitReturns --experimentalDecorators --suppressImplicitAnyIndexErrors --moduleResolution node", | ||
"build_test": "rm -rf spec-js && tsc -p test/tsconfig.json", | ||
"clean_dist_cjs": "rm -rf ./dist/cjs", | ||
"clean_dist_es6": "rm -rf ./dist/es6", | ||
"check_circular_dependencies": "madge ./dist/cjs --circular", | ||
"compile_cjs": "tsc dist/cjs/src/index.ts dist/cjs/src/proxy/index.ts -m commonjs --outDir dist/cjs --sourcemap --target ES5 -d --diagnostics --pretty --noImplicitAny --noImplicitReturns --noImplicitThis --noUnusedLocals --noUnusedParameters --experimentalDecorators --suppressImplicitAnyIndexErrors --moduleResolution node --noEmitHelpers --importHelpers --lib es5,es2015.iterable,es2015.collection,es2015.promise,dom", | ||
"compile_module_es6": "rm -rf dist/es6/dist/es6 && tsc dist/es6/src/index.ts src/proxy/index.ts -m ES2015 --outDir dist/es6 --sourcemap --target ES5 -d --diagnostics --pretty --noImplicitAny --noImplicitReturns --noImplicitThis --noUnusedLocals --noUnusedParameters --experimentalDecorators --suppressImplicitAnyIndexErrors --moduleResolution node --noEmitHelpers --importHelpers --lib es5,es2015.iterable,es2015.collection,es2015.promise,dom", | ||
"compile_cjs": "tsc dist/cjs/src/index.ts dist/cjs/src/proxy/index.ts -m commonjs --outDir dist/cjs --sourcemap --target ES5 -d --diagnostics --pretty --strict --noImplicitReturns --noUnusedLocals --noUnusedParameters --suppressImplicitAnyIndexErrors --moduleResolution node --noEmitHelpers --importHelpers --lib es5,es2015.iterable,es2015.collection,es2015.promise,dom", | ||
"compile_module_es6": "rm -rf dist/es6/dist/es6 && tsc dist/es6/src/index.ts src/proxy/index.ts -m ES2015 --outDir dist/es6 --sourcemap --target ES5 -d --diagnostics --pretty --strict --noImplicitReturns --noUnusedLocals --noUnusedParameters --suppressImplicitAnyIndexErrors --moduleResolution node --noEmitHelpers --importHelpers --lib es5,es2015.iterable,es2015.collection,es2015.promise,dom", | ||
"copy_src_cjs": "mkdirp ./dist/cjs/src && shx cp -r ./src/* ./dist/cjs/src", | ||
@@ -26,4 +26,4 @@ "copy_src_es6": "mkdirp ./dist/es6/src && shx cp -r ./src/* ./dist/es6/src", | ||
"watch": "NODE_ENV=test ts-node ./tools/watch.ts & npm run watch_test", | ||
"watch_cjs": "tsc src/index.ts -m commonjs --outDir dist --sourcemap --target ES5 -d --diagnostics --pretty --noImplicitAny --noImplicitReturns --experimentalDecorators --suppressImplicitAnyIndexErrors --moduleResolution node --noEmitHelpers --lib es5,es2015.iterable,es2015.collection,es2015.promise,dom -w", | ||
"watch_test": "tsc test/run.ts -m commonjs --outDir spec-js --sourcemap --target ES2015 --diagnostics --pretty --noImplicitAny --noImplicitReturns --experimentalDecorators --suppressImplicitAnyIndexErrors --moduleResolution node -w" | ||
"watch_cjs": "tsc src/index.ts -m commonjs --outDir dist --sourcemap --target ES5 -d --diagnostics --pretty --strict --noImplicitReturns --suppressImplicitAnyIndexErrors --moduleResolution node --noEmitHelpers --lib es5,es2015.iterable,es2015.collection,es2015.promise,dom -w", | ||
"watch_test": "tsc -p test/tsconfig.json -w --diagnostics --pretty" | ||
}, | ||
@@ -67,3 +67,3 @@ "keywords": [ | ||
"tslint-loader": "^3.5.3", | ||
"typescript": "^2.2.2", | ||
"typescript": "^2.3.2", | ||
"webpack": "^2.4.1", | ||
@@ -70,0 +70,0 @@ "webpack-dev-server": "^2.4.5" |
@@ -83,8 +83,3 @@ "use strict"; | ||
Logger.setLevel = function (level) { | ||
Logger.defaultLevel = level; | ||
Logger.outputLogger = new ContextLogger('[ReactiveDB]', level, function (name, _, message) { | ||
var current = new Date(); | ||
var prefix = name ? "[" + name + "] " : ''; | ||
return prefix + "at " + current.toLocaleString() + ": \r\n " + message; | ||
}); | ||
Logger.outputLogger.setLevel(level); | ||
}; | ||
@@ -127,3 +122,7 @@ Logger.warn = function () { | ||
Logger.defaultLevel = Level.debug; | ||
Logger.outputLogger = null; | ||
Logger.outputLogger = new ContextLogger('[ReactiveDB]', Logger.defaultLevel, function (name, _, message) { | ||
var current = new Date(); | ||
var prefix = name ? "[" + name + "] " : ''; | ||
return prefix + "at " + current.toLocaleString() + ": \r\n " + message; | ||
}); | ||
exports.Logger = Logger; | ||
@@ -130,0 +129,0 @@ var envifyLevel = function () { |
@@ -102,3 +102,3 @@ import { Observable } from 'rxjs/Observable' | ||
export interface UpsertContext { | ||
mapper: Function | ||
mapper: Function | null | ||
isNavigatorLeaf: boolean, | ||
@@ -143,3 +143,3 @@ visited: boolean, | ||
column: lf.schema.Column | ||
orderBy: lf.Order | ||
orderBy: lf.Order | null | ||
} | ||
@@ -146,0 +146,0 @@ |
@@ -71,3 +71,7 @@ export enum Level { | ||
private static defaultLevel = Level.debug | ||
private static outputLogger: ContextLogger = null | ||
private static outputLogger = new ContextLogger('[ReactiveDB]', Logger.defaultLevel, (name, _, message) => { | ||
const current = new Date() | ||
const prefix = name ? `[${name}] ` : '' | ||
return `${prefix}at ${current.toLocaleString()}: \r\n ` + message | ||
}) | ||
@@ -88,8 +92,3 @@ static get(name: string, formatter?: Formatter, level?: Level) { | ||
static setLevel(level: Level) { | ||
Logger.defaultLevel = level | ||
Logger.outputLogger = new ContextLogger('[ReactiveDB]', level, (name, _, message) => { | ||
const current = new Date() | ||
const prefix = name ? `[${name}] ` : '' | ||
return `${prefix}at ${current.toLocaleString()}: \r\n ` + message | ||
}) | ||
Logger.outputLogger.setLevel(level) | ||
} | ||
@@ -96,0 +95,0 @@ |
@@ -30,3 +30,3 @@ import { Observable } from 'rxjs/Observable' | ||
private schemas = new Map<string, ParsedSchema>() | ||
private schemaBuilder: lf.schema.Builder | ||
private schemaBuilder: lf.schema.Builder | null | ||
private connected = false | ||
@@ -38,9 +38,9 @@ // note thin cache will be unreliable in some eage case | ||
private findPrimaryKey = (name: string) => { | ||
return this.findSchema(name).pk | ||
return this.findSchema(name)!.pk | ||
} | ||
private findSchema = (name: string) => { | ||
private findSchema = (name: string): ParsedSchema => { | ||
const schema = this.schemas.get(name) | ||
assert(schema, Exception.NonExistentTable(name)) | ||
return schema | ||
return schema! | ||
} | ||
@@ -178,3 +178,3 @@ | ||
const [ table ] = Database.getTables(db, tableName) | ||
const columnMapper = schema.mapper | ||
const columnMapper = schema!.mapper | ||
const hiddenPayload = Object.create(null) | ||
@@ -184,3 +184,3 @@ | ||
// cannot create a hidden column for primary key | ||
if (!hasOwn(entity, key) || key === schema.pk) { | ||
if (!hasOwn(entity, key) || key === schema!.pk) { | ||
return | ||
@@ -196,7 +196,7 @@ } | ||
const predicate = createPredicate(table, clause.where) | ||
const query = predicatableQuery(db, table, predicate, StatementType.Update) | ||
const query = predicatableQuery(db, table, predicate!, StatementType.Update) | ||
forEach(mut, (val, key) => { | ||
const column = table[key] | ||
if (key === schema.pk) { | ||
if (key === schema!.pk) { | ||
warn(`Primary key is not modifiable.`) | ||
@@ -223,4 +223,4 @@ } else if (!column) { | ||
const [ table ] = Database.getTables(db, tableName) | ||
const column = table[pk] | ||
const provider = new PredicateProvider(table, clause.where) | ||
const column = table[pk!] | ||
const provider = new PredicateProvider(table, clause.where!) | ||
const prefetch = | ||
@@ -234,7 +234,7 @@ predicatableQuery(db, table, provider.getPredicate(), StatementType.Select, column) | ||
scopedIds.forEach((entity: any) => | ||
this.storedIds.delete(fieldIdentifier(tableName, entity[pk]))) | ||
this.storedIds.delete(fieldIdentifier(tableName, entity[pk!]))) | ||
return this.executor(db, [query]).do({ error: () => { | ||
scopedIds.forEach((entity: any) => | ||
this.storedIds.add(fieldIdentifier(tableName, entity[pk]))) | ||
this.storedIds.add(fieldIdentifier(tableName, entity[pk!]))) | ||
}}) | ||
@@ -274,3 +274,3 @@ }) | ||
} | ||
const disposeHandler = schema.dispose | ||
const disposeHandler = schema!.dispose | ||
@@ -283,9 +283,9 @@ return this.database$.concatMap((db) => { | ||
const removedIds: any = [] | ||
queries.push(predicatableQuery(db, table, predicate, StatementType.Delete)) | ||
queries.push(predicatableQuery(db, table, predicate!, StatementType.Delete)) | ||
const prefetch = predicatableQuery(db, table, predicate, StatementType.Select) | ||
const prefetch = predicatableQuery(db, table, predicate!, StatementType.Select) | ||
return Observable.fromPromise(prefetch.exec()) | ||
.concatMap((rootEntities) => { | ||
rootEntities.forEach(entity => { | ||
removedIds.push(fieldIdentifier(tableName, entity[schema.pk])) | ||
removedIds.push(fieldIdentifier(tableName, entity[schema!.pk])) | ||
}) | ||
@@ -331,3 +331,3 @@ | ||
this.schemaDefs.forEach((schemaDef, tableName) => { | ||
const tableBuilder = this.schemaBuilder.createTable(tableName) | ||
const tableBuilder = this.schemaBuilder!.createTable(tableName) | ||
this.parseSchemaDef(tableName, schemaDef, tableBuilder) | ||
@@ -425,3 +425,3 @@ }) | ||
const containKey = containFields ? contains(pk, clause.fields) : true | ||
const containKey = containFields ? contains(pk, clause.fields!) : true | ||
const fields: Set<Fields> = containFields ? new Set(clause.fields) : new Set(schema.columns.keys()) | ||
@@ -431,3 +431,3 @@ const { table, columns, joinInfo, definition } = | ||
const query = | ||
predicatableQuery(db, table, null, StatementType.Select, ...columns) | ||
predicatableQuery(db, table!, null, StatementType.Select, ...columns) | ||
@@ -439,3 +439,3 @@ joinInfo.forEach((info: JoinInfo) => | ||
return { | ||
column: table[desc.fieldName], | ||
column: table![desc.fieldName], | ||
orderBy: !desc.orderBy ? null : lf.Order[desc.orderBy] | ||
@@ -451,6 +451,6 @@ } | ||
definition, | ||
mainTable: table | ||
mainTable: table! | ||
} | ||
const { limit, skip } = clause | ||
const provider = new PredicateProvider(table, clause.where) | ||
const provider = new PredicateProvider(table!, clause.where!) | ||
@@ -556,3 +556,3 @@ return new Selector<T>(db, query, matcher, provider, limit, skip, orderDesc) | ||
const { where, type } = defs as Association | ||
rootDefinition[key] = definition.revise(type, ret.definition) | ||
rootDefinition[key] = definition.revise(type!, ret.definition) | ||
const [ predicate, err ] = tryCatch(createPredicate)(currentTable, where(ret.table)) | ||
@@ -576,3 +576,3 @@ if (err) { | ||
traversable.context((field, val, ctx) => { | ||
if (ctx.isRoot || typeof field !== 'string') { | ||
if (!ctx || ctx.isRoot || typeof field !== 'string') { | ||
return false | ||
@@ -607,3 +607,3 @@ } | ||
const { column, identifier } = ctx.leaf as ColumnLeaf | ||
const type = schema.columns.get(ctx.key) | ||
const type = schema.columns.get(ctx.key)! | ||
const columnDef = definition.create(identifier, schema.pk === ctx.key, type) | ||
@@ -651,3 +651,3 @@ handleAdvanced({ columns: [column], advanced: true }, ctx.key, columnDef) | ||
const stored = contains(identifier, this.storedIds) | ||
const mut = visited ? sharing.get(identifier) : new Mutation(db, table) | ||
const mut = visited ? sharing.get(identifier)! : new Mutation(db, table) | ||
@@ -667,8 +667,8 @@ if (!visited) { | ||
if (!(isColumn || isNavigator || ctx.isRoot)) { | ||
if (!(isColumn || isNavigator || ctx!.isRoot)) { | ||
// 若当前节点非 有效节点、叶子节点或者根节点中任意一种时,直接停止子节点的迭代 | ||
ctx.skip() | ||
ctx!.skip() | ||
} | ||
return (ctx.isRoot || (!isColumn && !isNavigator)) ? false : { | ||
return (ctx!.isRoot || (!isColumn && !isNavigator)) ? false : { | ||
mapper, | ||
@@ -684,3 +684,3 @@ visited, | ||
if (ctx.isNavigatorLeaf) { | ||
const ref = schema.associations.get(ctx.key).name | ||
const ref = schema.associations.get(ctx.key)!.name | ||
return this.traverseCompound(db, ref, node, insertMutList, updateMutList, sharing) | ||
@@ -740,3 +740,3 @@ } | ||
const predicate = createPredicate(table, clause) | ||
const query = predicatableQuery(db, table, predicate, StatementType.Delete) | ||
const query = predicatableQuery(db, table, predicate!, StatementType.Delete) | ||
@@ -748,3 +748,3 @@ queryCollection.push(query) | ||
const get = (where: Predicate<any> = null) => { | ||
const get = (where: Predicate<any> | null = null) => { | ||
const [ table ] = Database.getTables(db, tableName) | ||
@@ -755,3 +755,3 @@ const [ predicate, err ] = tryCatch(createPredicate)(table, where) | ||
} | ||
const query = predicatableQuery(db, table, predicate, StatementType.Select) | ||
const query = predicatableQuery(db, table, predicate!, StatementType.Select) | ||
@@ -758,0 +758,0 @@ return Observable.fromPromise<T[]>(query.exec()) |
@@ -5,4 +5,4 @@ import * as lf from 'lovefield' | ||
export function createPredicate<T>(table: lf.schema.Table, clause: Predicate<T> = null) { | ||
export function createPredicate<T>(table: lf.schema.Table, clause: Predicate<T> | null = null) { | ||
return clause ? new PredicateProvider(table, clause).getPredicate() : null | ||
} |
@@ -7,3 +7,3 @@ import * as lf from 'lovefield' | ||
table: lf.schema.Table, | ||
predicate: lf.Predicate, | ||
predicate: lf.Predicate | null, | ||
type: StatementType.Select, | ||
@@ -16,3 +16,3 @@ ...columns: lf.schema.Column[] | ||
table: lf.schema.Table, | ||
predicate: lf.Predicate, | ||
predicate: lf.Predicate | null, | ||
type: StatementType.Delete, | ||
@@ -25,3 +25,3 @@ ...columns: lf.schema.Column[] | ||
table: lf.schema.Table, | ||
predicate: lf.Predicate, | ||
predicate: lf.Predicate | null, | ||
type: StatementType.Update, | ||
@@ -34,3 +34,3 @@ ...columns: lf.schema.Column[] | ||
table: lf.schema.Table, | ||
predicate: lf.Predicate, | ||
predicate: lf.Predicate | null, | ||
type: StatementType.Select | StatementType.Update | StatementType.Delete, | ||
@@ -51,2 +51,4 @@ ...columns: lf.schema.Column[] | ||
break | ||
default: | ||
throw TypeError('unreachable code path') | ||
} | ||
@@ -53,0 +55,0 @@ |
@@ -60,3 +60,3 @@ import { forEach, assert, warn } from '../../utils' | ||
contextIds: keys, | ||
queries: [].concat(insertQueries).concat(updateQueries) | ||
queries: insertQueries.concat(updateQueries as any[]) | ||
} | ||
@@ -63,0 +63,0 @@ } |
@@ -77,3 +77,3 @@ import * as lf from 'lovefield' | ||
getPredicate(): lf.Predicate { | ||
getPredicate(): lf.Predicate | null { | ||
const predicates = this.normalizeMeta(this.meta) | ||
@@ -91,4 +91,7 @@ if (predicates.length) { | ||
toString() { | ||
return this.getPredicate().toString() | ||
toString(): string | void { | ||
const pred = this.getPredicate() | ||
if (pred !== null) { | ||
return pred.toString() | ||
} | ||
} | ||
@@ -95,0 +98,0 @@ |
@@ -6,25 +6,18 @@ import { Observable } from 'rxjs/Observable' | ||
private mapFn: <U, K>(v: U, index?: number, array?: U[]) => K = (v: T) => v | ||
public request$: Observable<T[]> | ||
constructor ( | ||
public request$: Observable<T> | Observable<T[]>, | ||
request$: Observable<T> | Observable<T[]>, | ||
public query: Query<T>, | ||
public tableName: string | ||
) { | ||
this.request$ = this.request$.map((v: T| T[]) => { | ||
if (typeof this.mapFn === 'function') { | ||
if (Array.isArray(v)) { | ||
return v.map(this.mapFn) | ||
} else { | ||
return [this.mapFn(v)] | ||
} | ||
this.request$ = request$.map((r: T | T[]) => { | ||
if (Array.isArray(r)) { | ||
return r | ||
} else { | ||
return [ r ] | ||
} | ||
return v | ||
}) | ||
} | ||
setMapFn(fn: <K>(v: T, index?: number, array?: T[]) => K) { | ||
this.mapFn = fn | ||
} | ||
values() { | ||
@@ -31,0 +24,0 @@ return this.request$ |
@@ -9,29 +9,19 @@ import { Observable } from 'rxjs/Observable' | ||
mapFn: <J, K>(v: J, index?: number, array?: J[]) => K | ||
selector$: Observable<SelectorMeta<T>> | ||
constructor(public selector$: Observable<SelectorMeta<T>>) { } | ||
constructor(meta$: Observable<SelectorMeta<T>>) { | ||
this.selector$ = meta$ | ||
.do((selector: SelectorMeta<T>) => { | ||
if (!(selector instanceof ProxySelector)) { | ||
(selector as Selector<T>).setMapFn(this.mapFn) | ||
} | ||
}) | ||
.publishReplay(1) | ||
.refCount() | ||
map<K>(fn: (stream$: Observable<T[]>) => Observable<K[]>) { | ||
this.selector$ = this.selector$ | ||
.do(s => this.decoratorSelector(s, fn)) | ||
return this as any as QueryToken<K> | ||
} | ||
map<K>(fn: (v: T, index?: number, array?: T[]) => K) { | ||
this.mapFn = fn | ||
return this | ||
} | ||
values() { | ||
values(): Observable<T[]> { | ||
return (this.selector$ as Observable<Selector<T>>) | ||
.switchMap(selector => selector.values()).take(1) | ||
.switchMap(s => s.values()) | ||
.take(1) | ||
} | ||
changes() { | ||
changes(): Observable<T[]> { | ||
return (this.selector$ as Observable<Selector<T>>) | ||
.switchMap(selector => selector.changes()) | ||
.switchMap(s => s.changes()) | ||
} | ||
@@ -58,6 +48,20 @@ | ||
const first = r.shift() | ||
return first[method](...r) | ||
return first | ||
}) | ||
return new QueryToken<T>(newSelector$) | ||
} | ||
private decoratorSelector(selector: SelectorMeta<T>, fn: <K>(stream$: Observable<T[]>) => Observable<K[]>) { | ||
const methods = ['changes', 'values'] | ||
methods.forEach(method => { | ||
const originFn = selector[method] | ||
selector[method] = () => { | ||
const dist$ = originFn.call(selector) | ||
if (typeof fn === 'function') { | ||
return fn(dist$) | ||
} | ||
return dist$ | ||
} | ||
}) | ||
} | ||
} |
@@ -16,7 +16,7 @@ import { Observer } from 'rxjs/Observer' | ||
.map(m => ({ skip: m.skip, limit: m.limit })) | ||
.sort((x, y) => x.skip - y.skip) | ||
.sort((x, y) => x.skip! - y.skip!) | ||
const { db, lselect, shape, predicateProvider } = meta | ||
const [ minSkip ] = skipsAndLimits | ||
const maxLimit = skipsAndLimits.reduce((acc, current) => { | ||
const nextSkip = acc.skip + acc.limit | ||
const nextSkip = acc.skip! + acc.limit! | ||
assert(current.skip === nextSkip, Exception.TokenConcatFailed(` | ||
@@ -31,3 +31,3 @@ skip should be serial, | ||
db, lselect, shape, predicateProvider, | ||
maxLimit.limit + maxLimit.skip, minSkip.skip, meta.orderDescriptions | ||
maxLimit.limit! + maxLimit.skip!, minSkip.skip, meta.orderDescriptions | ||
) | ||
@@ -80,4 +80,2 @@ } | ||
private mapFn: <J, K>(v: J, index?: number, array?: J[]) => K = (v: T) => v | ||
private consumed = false | ||
@@ -87,3 +85,3 @@ private predicateBuildErr = false | ||
private get rangeQuery(): lf.query.Select { | ||
let predicate: lf.Predicate = null | ||
let predicate: lf.Predicate | null = null | ||
const { predicateProvider } = this | ||
@@ -100,7 +98,7 @@ if (predicateProvider && !this.predicateBuildErr) { | ||
forEach(this.orderDescriptions, orderInfo => | ||
rangeQuery.orderBy(orderInfo.column, orderInfo.orderBy) | ||
rangeQuery.orderBy(orderInfo.column, orderInfo.orderBy!) | ||
) | ||
} | ||
rangeQuery.limit(this.limit).skip(this.skip) | ||
rangeQuery.limit(this.limit!).skip(this.skip!) | ||
@@ -115,3 +113,3 @@ return rangeQuery | ||
forEach(this.orderDescriptions, orderInfo => | ||
q.orderBy(orderInfo.column, orderInfo.orderBy) | ||
q.orderBy(orderInfo.column, orderInfo.orderBy!) | ||
) | ||
@@ -127,3 +125,3 @@ } | ||
private shape: ShapeMatcher, | ||
public predicateProvider?: PredicateProvider<T>, | ||
public predicateProvider?: PredicateProvider<T> | null, | ||
private limit?: number, | ||
@@ -137,5 +135,3 @@ private skip?: number, | ||
if (!predicate) { | ||
predicateProvider = null | ||
this.predicateProvider = null | ||
this.predicateBuildErr = true | ||
throw new TypeError() | ||
} | ||
@@ -166,3 +162,3 @@ } catch (err) { | ||
const $predicate = predicateProvider | ||
? lf.op.and($in, predicateProvider.getPredicate()) | ||
? lf.op.and($in, predicateProvider.getPredicate()!) | ||
: $in | ||
@@ -185,3 +181,3 @@ const query = this.query | ||
const query = predicateProvider ? this.query | ||
.where(predicateProvider.getPredicate()) : this.query | ||
.where(predicateProvider.getPredicate()!) : this.query | ||
listener() | ||
@@ -199,6 +195,6 @@ db.observe(query, listener) | ||
toString(): string { | ||
let predicate: lf.Predicate | ||
let predicate: lf.Predicate | undefined | ||
const { predicateProvider } = this | ||
if (predicateProvider && !this.predicateBuildErr) { | ||
predicate = predicateProvider.getPredicate() | ||
predicate = predicateProvider.getPredicate()! | ||
} | ||
@@ -212,3 +208,3 @@ return predicate ? this.query.where(predicate).toSql() : this.query.toSql() | ||
this.consumed = true | ||
if (this.limit || this.skip) { | ||
if (typeof this.limit !== 'undefined' || typeof this.skip !== 'undefined') { | ||
const p = this.rangeQuery.exec() | ||
@@ -228,7 +224,7 @@ .then(r => r.map(v => v[this.shape.pk.name])) | ||
concat(... selectMetas: Selector<T>[]): Selector<T> { | ||
const orderStr = Selector.stringifyOrder(this.orderDescriptions) | ||
const orderStr = Selector.stringifyOrder(this.orderDescriptions!) | ||
const equal = selectMetas.every(m => | ||
m.select === this.select && | ||
m.predicateProvider.toString() === this.predicateProvider.toString() && | ||
Selector.stringifyOrder(m.orderDescriptions) === orderStr | ||
m.predicateProvider!.toString() === this.predicateProvider!.toString() && | ||
Selector.stringifyOrder(m.orderDescriptions!) === orderStr | ||
) | ||
@@ -246,6 +242,2 @@ assert(equal, Exception.TokenConcatFailed()) | ||
setMapFn<J, K>(fn: (v: J, index?: number, array?: J[]) => K) { | ||
this.mapFn = fn | ||
} | ||
private getValue(pks?: (string | number)[]) { | ||
@@ -257,3 +249,3 @@ let q: lf.query.Select | ||
? predIn | ||
: lf.op.and(predIn, this.predicateProvider.getPredicate()) | ||
: lf.op.and(predIn, this.predicateProvider.getPredicate()!) | ||
@@ -264,3 +256,3 @@ q = this.query.where(predicate) | ||
if (!this.predicateBuildErr) { | ||
q = q.where(this.predicateProvider.getPredicate()) | ||
q = q.where(this.predicateProvider!.getPredicate()!) | ||
} | ||
@@ -274,8 +266,2 @@ } | ||
}) | ||
.then(v => { | ||
if (typeof this.mapFn === 'function') { | ||
v = v.map(this.mapFn) | ||
} | ||
return v | ||
}) | ||
} | ||
@@ -282,0 +268,0 @@ |
import { forEach } from './for-each' | ||
export const clone = <T>(origin: T, target: T = null): T | null => { | ||
export const clone = <T>(origin: T, target: T | null = null): T | null => { | ||
if (origin == null) { | ||
@@ -30,3 +30,3 @@ return origin | ||
forEach(origin, (val, key) => { | ||
target[key] = clone(val, null) | ||
target![key] = clone(val, null) | ||
}) | ||
@@ -33,0 +33,0 @@ |
@@ -1,1 +0,1 @@ | ||
export default '0.9.3' | ||
export default '0.9.4' |
@@ -469,3 +469,3 @@ "use strict"; | ||
traversable.context(function (field, val, ctx) { | ||
if (ctx.isRoot || typeof field !== 'string') { | ||
if (!ctx || ctx.isRoot || typeof field !== 'string') { | ||
return false; | ||
@@ -472,0 +472,0 @@ } |
/// <reference types="lovefield" /> | ||
import * as lf from 'lovefield'; | ||
import { Predicate } from '../../interface'; | ||
export declare function createPredicate<T>(table: lf.schema.Table, clause?: Predicate<T>): lf.Predicate; | ||
export declare function createPredicate<T>(table: lf.schema.Table, clause?: Predicate<T> | null): lf.Predicate | null; |
/// <reference types="lovefield" /> | ||
import * as lf from 'lovefield'; | ||
import { StatementType } from '../../interface'; | ||
export declare function predicatableQuery(db: lf.Database, table: lf.schema.Table, predicate: lf.Predicate, type: StatementType.Select, ...columns: lf.schema.Column[]): lf.query.Select; | ||
export declare function predicatableQuery(db: lf.Database, table: lf.schema.Table, predicate: lf.Predicate, type: StatementType.Delete, ...columns: lf.schema.Column[]): lf.query.Delete; | ||
export declare function predicatableQuery(db: lf.Database, table: lf.schema.Table, predicate: lf.Predicate, type: StatementType.Update, ...columns: lf.schema.Column[]): lf.query.Update; | ||
export declare function predicatableQuery(db: lf.Database, table: lf.schema.Table, predicate: lf.Predicate | null, type: StatementType.Select, ...columns: lf.schema.Column[]): lf.query.Select; | ||
export declare function predicatableQuery(db: lf.Database, table: lf.schema.Table, predicate: lf.Predicate | null, type: StatementType.Delete, ...columns: lf.schema.Column[]): lf.query.Delete; | ||
export declare function predicatableQuery(db: lf.Database, table: lf.schema.Table, predicate: lf.Predicate | null, type: StatementType.Update, ...columns: lf.schema.Column[]): lf.query.Update; |
@@ -20,2 +20,4 @@ "use strict"; | ||
break; | ||
default: | ||
throw TypeError('unreachable code path'); | ||
} | ||
@@ -22,0 +24,0 @@ return predicate ? query.where(predicate) : query; |
@@ -10,3 +10,3 @@ /// <reference types="lovefield" /> | ||
contextIds: any[]; | ||
queries: any[]; | ||
queries: lf.query.Insert[]; | ||
}; | ||
@@ -13,0 +13,0 @@ private toUpdater(); |
@@ -46,3 +46,3 @@ "use strict"; | ||
contextIds: keys, | ||
queries: [].concat(insertQueries).concat(updateQueries) | ||
queries: insertQueries.concat(updateQueries) | ||
}; | ||
@@ -49,0 +49,0 @@ }; |
@@ -8,4 +8,4 @@ /// <reference types="lovefield" /> | ||
constructor(table: lf.schema.Table, meta: Predicate<T>); | ||
getPredicate(): lf.Predicate; | ||
toString(): string; | ||
getPredicate(): lf.Predicate | null; | ||
toString(): string | void; | ||
private normalizeMeta(meta, column?); | ||
@@ -12,0 +12,0 @@ private checkMethod(methodName); |
@@ -77,3 +77,6 @@ "use strict"; | ||
PredicateProvider.prototype.toString = function () { | ||
return this.getPredicate().toString(); | ||
var pred = this.getPredicate(); | ||
if (pred !== null) { | ||
return pred.toString(); | ||
} | ||
}; | ||
@@ -80,0 +83,0 @@ PredicateProvider.prototype.normalizeMeta = function (meta, column) { |
import { Observable } from 'rxjs/Observable'; | ||
import { Query } from '../../interface'; | ||
export declare class ProxySelector<T> { | ||
request$: Observable<T> | Observable<T[]>; | ||
query: Query<T>; | ||
tableName: string; | ||
private mapFn; | ||
request$: Observable<T[]>; | ||
constructor(request$: Observable<T> | Observable<T[]>, query: Query<T>, tableName: string); | ||
setMapFn(fn: <K>(v: T, index?: number, array?: T[]) => K): void; | ||
values(): Observable<T> | Observable<T[]>; | ||
changes(): Observable<T> | Observable<T[]>; | ||
values(): Observable<T[]>; | ||
changes(): Observable<T[]>; | ||
} |
@@ -5,22 +5,13 @@ "use strict"; | ||
function ProxySelector(request$, query, tableName) { | ||
var _this = this; | ||
this.request$ = request$; | ||
this.query = query; | ||
this.tableName = tableName; | ||
this.mapFn = function (v) { return v; }; | ||
this.request$ = this.request$.map(function (v) { | ||
if (typeof _this.mapFn === 'function') { | ||
if (Array.isArray(v)) { | ||
return v.map(_this.mapFn); | ||
} | ||
else { | ||
return [_this.mapFn(v)]; | ||
} | ||
this.request$ = request$.map(function (r) { | ||
if (Array.isArray(r)) { | ||
return r; | ||
} | ||
return v; | ||
else { | ||
return [r]; | ||
} | ||
}); | ||
} | ||
ProxySelector.prototype.setMapFn = function (fn) { | ||
this.mapFn = fn; | ||
}; | ||
ProxySelector.prototype.values = function () { | ||
@@ -27,0 +18,0 @@ return this.request$; |
@@ -6,6 +6,5 @@ import { Observable } from 'rxjs/Observable'; | ||
export declare class QueryToken<T> { | ||
mapFn: <J, K>(v: J, index?: number, array?: J[]) => K; | ||
selector$: Observable<SelectorMeta<T>>; | ||
constructor(meta$: Observable<SelectorMeta<T>>); | ||
map<K>(fn: (v: T, index?: number, array?: T[]) => K): this; | ||
constructor(selector$: Observable<SelectorMeta<T>>); | ||
map<K>(fn: (stream$: Observable<T[]>) => Observable<K[]>): QueryToken<K>; | ||
values(): Observable<T[]>; | ||
@@ -17,2 +16,3 @@ changes(): Observable<T[]>; | ||
private composeFactory(tokens, method); | ||
private decoratorSelector(selector, fn); | ||
} |
@@ -6,15 +6,9 @@ "use strict"; | ||
var QueryToken = (function () { | ||
function QueryToken(meta$) { | ||
var _this = this; | ||
this.selector$ = meta$ | ||
.do(function (selector) { | ||
if (!(selector instanceof ProxySelector_1.ProxySelector)) { | ||
selector.setMapFn(_this.mapFn); | ||
} | ||
}) | ||
.publishReplay(1) | ||
.refCount(); | ||
function QueryToken(selector$) { | ||
this.selector$ = selector$; | ||
} | ||
QueryToken.prototype.map = function (fn) { | ||
this.mapFn = fn; | ||
var _this = this; | ||
this.selector$ = this.selector$ | ||
.do(function (s) { return _this.decoratorSelector(s, fn); }); | ||
return this; | ||
@@ -24,7 +18,8 @@ }; | ||
return this.selector$ | ||
.switchMap(function (selector) { return selector.values(); }).take(1); | ||
.switchMap(function (s) { return s.values(); }) | ||
.take(1); | ||
}; | ||
QueryToken.prototype.changes = function () { | ||
return this.selector$ | ||
.switchMap(function (selector) { return selector.changes(); }); | ||
.switchMap(function (s) { return s.changes(); }); | ||
}; | ||
@@ -55,6 +50,20 @@ QueryToken.prototype.concat = function () { | ||
var first = r.shift(); | ||
return first[method].apply(first, r); | ||
return (_a = first)[method].apply(_a, r); | ||
var _a; | ||
}); | ||
return new QueryToken(newSelector$); | ||
}; | ||
QueryToken.prototype.decoratorSelector = function (selector, fn) { | ||
var methods = ['changes', 'values']; | ||
methods.forEach(function (method) { | ||
var originFn = selector[method]; | ||
selector[method] = function () { | ||
var dist$ = originFn.call(selector); | ||
if (typeof fn === 'function') { | ||
return fn(dist$); | ||
} | ||
return dist$; | ||
}; | ||
}); | ||
}; | ||
return QueryToken; | ||
@@ -61,0 +70,0 @@ }()); |
@@ -10,3 +10,3 @@ /// <reference types="lovefield" /> | ||
private shape; | ||
predicateProvider: PredicateProvider<T>; | ||
predicateProvider: PredicateProvider<T> | null; | ||
private limit; | ||
@@ -20,3 +20,2 @@ private skip; | ||
change$: Observable<T[]>; | ||
private mapFn; | ||
private consumed; | ||
@@ -26,3 +25,3 @@ private predicateBuildErr; | ||
private readonly query; | ||
constructor(db: lf.Database, lselect: lf.query.Select, shape: ShapeMatcher, predicateProvider?: PredicateProvider<T>, limit?: number, skip?: number, orderDescriptions?: OrderInfo[]); | ||
constructor(db: lf.Database, lselect: lf.query.Select, shape: ShapeMatcher, predicateProvider?: PredicateProvider<T> | null, limit?: number, skip?: number, orderDescriptions?: OrderInfo[]); | ||
toString(): string; | ||
@@ -33,3 +32,2 @@ values(): Observable<T[]> | never; | ||
changes(): Observable<T[]> | never; | ||
setMapFn<J, K>(fn: (v: J, index?: number, array?: J[]) => K): void; | ||
private getValue(pks?); | ||
@@ -36,0 +34,0 @@ private removeKey(data, key); |
@@ -20,3 +20,2 @@ "use strict"; | ||
this.orderDescriptions = orderDescriptions; | ||
this.mapFn = function (v) { return v; }; | ||
this.consumed = false; | ||
@@ -28,5 +27,3 @@ this.predicateBuildErr = false; | ||
if (!predicate) { | ||
predicateProvider = null; | ||
this.predicateProvider = null; | ||
this.predicateBuildErr = true; | ||
throw new TypeError(); | ||
} | ||
@@ -191,3 +188,3 @@ } | ||
this.consumed = true; | ||
if (this.limit || this.skip) { | ||
if (typeof this.limit !== 'undefined' || typeof this.skip !== 'undefined') { | ||
var p = this.rangeQuery.exec() | ||
@@ -229,5 +226,2 @@ .then(function (r) { return r.map(function (v) { return v[_this.shape.pk.name]; }); }) | ||
}; | ||
Selector.prototype.setMapFn = function (fn) { | ||
this.mapFn = fn; | ||
}; | ||
Selector.prototype.getValue = function (pks) { | ||
@@ -254,8 +248,2 @@ var _this = this; | ||
return !_this.shape.pk.queried ? _this.removeKey(result, col) : result; | ||
}) | ||
.then(function (v) { | ||
if (typeof _this.mapFn === 'function') { | ||
v = v.map(_this.mapFn); | ||
} | ||
return v; | ||
}); | ||
@@ -262,0 +250,0 @@ }; |
@@ -1,1 +0,1 @@ | ||
export declare const clone: <T>(origin: T, target?: T) => T; | ||
export declare const clone: <T>(origin: T, target?: T | null) => T | null; |
@@ -1,1 +0,1 @@ | ||
export declare function tryCatch<T>(this: any, fn: (...args: any[]) => T): (...args: any[]) => [T, Error]; | ||
export declare function tryCatch<T>(this: any, fn: (...args: any[]) => T): (...args: any[]) => [T | null, Error | null]; |
@@ -1,2 +0,2 @@ | ||
declare var _default: "0.9.3"; | ||
declare var _default: "0.9.4"; | ||
export default _default; |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.default = '0.9.3'; | ||
exports.default = '0.9.4'; | ||
//# sourceMappingURL=version.js.map |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
200
251164
4522