@omneedia/client-js
Version:
Isomorphic Javascript client for Omneedia
217 lines (215 loc) • 5.42 kB
text/typescript
import OARequest from './request'
export default class OmneediaQueryDB {
private TABLE: string
private SELECT: Array<string> = []
private INSERT: Object = {}
private UPDATE: Object = {}
private DELETE: boolean = false
private WHERE: Array<string> = []
private ref: any = {}
private request: any
private FilterOperator = [
'eq',
'neq',
'gt',
'gte',
'lt',
'lte',
'like',
'ilike',
'is',
'in',
'cs',
'cd',
'sl',
'sr',
'nxl',
'nxr',
'adj',
'ov',
'fts',
'plfts',
'phfts',
'wfts',
]
constructor(table: string, ref: any) {
this.TABLE = table
this.ref = ref
this.request = new OARequest(this)
}
rangeLt(key: string, value: any) {
this.WHERE.push(`${key}=sl.${value}`)
return this
}
rangeGt(key: string, value: any) {
this.WHERE.push(`${key}=sr.${value}`)
return this
}
rangeLte(key: string, value: any) {
this.WHERE.push(`${key}=nxr.${value}`)
return this
}
rangeGte(key: string, value: any) {
this.WHERE.push(`${key}=nxl.${value}`)
return this
}
rangeAdjacent(key: string, value: any) {
this.WHERE.push(`${key}=adj.${value}`)
return this
}
overlaps(key: string, value: any) {
if (!Array.isArray(value)) value = [value]
value = `[${value.join(',')}]`
this.WHERE.push(`${key}=ov.${value}`)
return this
}
not(key: string, value: any, o: any) {
if (this.FilterOperator.indexOf(value) == -1) return this
this.WHERE.push(`${key}=not.${value}.${o}`)
return this
}
is(key: string, value: any) {
this.WHERE.push(`${key}=is.${value}`)
return this
}
contains(key: string, value: any) {
if (!Array.isArray(value)) value = [value]
value = `{${value.join(',')}}`
this.WHERE.push(`${key}=cs.${value}`)
return this
}
containedBy(key: any, value: any) {
if (!Array.isArray(value)) value = [value]
value = `{${value.join(',')}}`
this.WHERE.push(`${key}=cd.${value}`)
return this
}
or(key: any) {
if (!Array.isArray(key)) key = [key]
if (key.length == 1) key = key[0].split(',')
this.WHERE.push(`or=(${key.join(',')})`)
return this
}
and(key: any) {
if (!Array.isArray(key)) key = [key]
if (key.length == 1) key = key[0].split(',')
this.WHERE.push(`and=(${key.join(',')})`)
return this
}
textSearch(key: string, value: any, o: any) {
let typePart = ''
if (o) {
if (o.type === 'plain') {
typePart = 'pl'
} else if (o.type === 'phrase') {
typePart = 'ph'
} else if (o.type === 'websearch') {
typePart = 'w'
}
}
let method = `${typePart}fts`
this.WHERE.push(`${key}=${method}.${value}`)
return this
}
in(key: string, value: any) {
if (!Array.isArray(value)) value = [value]
value = `(${value.join(',')})`
this.WHERE.push(`${key}=in.${value}`)
return this
}
nxr(key: string, value: any) {
if (!Array.isArray(value)) value = [value]
value = `(${value.join(',')})`
this.WHERE.push(`${key}=nxr.${value}`)
return this
}
sl(key: string, value: any) {
if (!Array.isArray(value)) value = [value]
value = `(${value.join(',')})`
this.WHERE.push(`${key}=sl.${value}`)
return this
}
adj(key: string, value: any) {
if (!Array.isArray(value)) value = [value]
value = `(${value.join(',')})`
this.WHERE.push(`${key}=adj.${value}`)
return this
}
imatch(key: any) {
for (var el in key) {
this.WHERE.push(`${el}=eq.${key[el]}`)
}
return this
}
match(key: any) {
for (var el in key) {
this.WHERE.push(`${el}=eq.${key[el]}`)
}
return this
}
gt(key: string, value: string) {
this.WHERE.push(`${key}=gt.${value}`)
return this
}
gte(key: string, value: string) {
this.WHERE.push(`${key}=gte.${value}`)
return this
}
lt(key: string, value: string) {
this.WHERE.push(`${key}=lt.${value}`)
return this
}
lte(key: string, value: string) {
this.WHERE.push(`${key}=lte.${value}`)
return this
}
neq(key: string, value: string) {
this.WHERE.push(`${key}=neq.${value}`)
return this
}
like(key: string, value: string) {
this.WHERE.push(`${key}=like.${value}`)
return this
}
ilike(key: string, value: string) {
this.WHERE.push(`${key}=ilike.${value}`)
return this
}
eq(key: string, value: string) {
this.WHERE.push(`${key}=eq.${value}`)
return this
}
select(...s: any) {
if (!s) s = ['']
if (s.length == 1) s = s[0].split(',')
this.SELECT = s
return this
}
insert(o: any) {
this.INSERT = o
return this
}
update(o: any) {
this.UPDATE = o
return this
}
delete() {
this.DELETE = true
return this
}
async then(resolve: any, reject: any) {
var uri = `/${this.TABLE}?`
if (Object.keys(this.INSERT).length > 0) {
var url = this.ref.PREFIX.REST + uri
return resolve(this.request.post(url, this.INSERT))
}
if (this.SELECT.length > 0) uri += `select=${this.SELECT.join(',')}&`
if (this.WHERE.length > 0) uri += this.WHERE.join('&')
var url = this.ref.PREFIX.REST + uri
var method = 'get'
if (this.DELETE === true) method = 'delete'
if (Object.keys(this.UPDATE).length > 0) {
resolve(this.request.patch(url, this.UPDATE))
} else resolve(this.request[method](url))
}
}