UNPKG

10.9 kBTypeScriptView Raw
1/// <reference types="node" />
2import stream from 'stream';
3import { BaseModel, ModelColumnNamesWithId } from './model';
4import { Transaction } from './transaction';
5import { RecordID } from './types';
6interface QueryOptions {
7 lean: boolean;
8 orders?: string;
9 near?: any;
10 select_columns?: string[];
11 select_single: boolean;
12 conditions_of_group: any[];
13 group_fields?: any;
14 group_by?: string[];
15 limit?: number;
16 skip?: number;
17 one?: boolean;
18 explain?: boolean;
19 cache?: {
20 key: string;
21 ttl: number;
22 refresh?: boolean;
23 };
24 transaction?: Transaction;
25 node?: 'master' | 'read';
26 index_hint?: string;
27}
28export interface QuerySingle<M extends BaseModel, T = M> extends PromiseLike<T> {
29 clone(): QuerySingle<M, T>;
30 find(id: RecordID): QuerySingle<M, T>;
31 find(id: RecordID[]): QueryArray<M, T>;
32 findPreserve(id: RecordID[]): QueryArray<M, T>;
33 near(target: object): QuerySingle<M, T>;
34 where(condition?: object): QuerySingle<M, T>;
35 select<K extends ModelColumnNamesWithId<M>>(columns: K[]): QuerySingle<M, Pick<M, K>>;
36 select<K extends ModelColumnNamesWithId<M>>(columns?: string): QuerySingle<M, Pick<M, K>>;
37 selectSingle<K extends ModelColumnNamesWithId<M>>(column: K): QuerySingle<M, M[K]>;
38 order(orders?: string): QuerySingle<M, T>;
39 group<G extends ModelColumnNamesWithId<M>, F>(group_by: G | G[], fields?: F): QuerySingle<M, {
40 [field in keyof F]: number;
41 } & Pick<M, G>>;
42 group<F>(group_by: null, fields?: F): QuerySingle<M, {
43 [field in keyof F]: number;
44 }>;
45 group<U>(group_by: string | null, fields?: object): QuerySingle<M, U>;
46 one(): QuerySingleNull<M, T>;
47 limit(limit?: number): QuerySingle<M, T>;
48 skip(skip?: number): QuerySingle<M, T>;
49 lean(lean?: boolean): QuerySingle<M, T>;
50 if(condition: boolean): QuerySingle<M, T>;
51 endif(): QuerySingle<M, T>;
52 cache(options: QueryOptions['cache']): QuerySingle<M, T>;
53 include(column: string, select?: string): QuerySingle<M, T>;
54 transaction(transaction?: Transaction): QuerySingle<M, T>;
55 using(node: 'master' | 'read'): QuerySingle<M, T>;
56 index_hint(hint: string): QuerySingle<M, T>;
57 exec(options?: {
58 skip_log?: boolean;
59 }): PromiseLike<T>;
60 stream(): stream.Readable;
61 explain(): PromiseLike<any>;
62 count(): PromiseLike<number>;
63 update(updates: object): PromiseLike<number>;
64 upsert(updates: object): PromiseLike<void>;
65 delete(options?: any): PromiseLike<number>;
66}
67interface QuerySingleNull<M extends BaseModel, T = M> extends PromiseLike<T | null> {
68 clone(): QuerySingleNull<M, T>;
69 find(id: RecordID): QuerySingle<M, T>;
70 find(id: RecordID[]): QueryArray<M, T>;
71 findPreserve(id: RecordID[]): QueryArray<M, T>;
72 near(target: object): QuerySingleNull<M, T>;
73 where(condition?: object): QuerySingleNull<M, T>;
74 select<K extends ModelColumnNamesWithId<M>>(columns: K[]): QuerySingleNull<M, Pick<M, K>>;
75 select<K extends ModelColumnNamesWithId<M>>(columns?: string): QuerySingleNull<M, Pick<M, K>>;
76 selectSingle<K extends ModelColumnNamesWithId<M>>(column: K): QuerySingleNull<M, M[K]>;
77 order(orders?: string): QuerySingleNull<M, T>;
78 group<G extends ModelColumnNamesWithId<M>, F>(group_by: G | G[], fields?: F): QuerySingleNull<M, {
79 [field in keyof F]: number;
80 } & Pick<M, G>>;
81 group<F>(group_by: null, fields?: F): QuerySingleNull<M, {
82 [field in keyof F]: number;
83 }>;
84 group<U>(group_by: string | null, fields?: object): QuerySingleNull<M, U>;
85 one(): QuerySingleNull<M, T>;
86 limit(limit?: number): QuerySingleNull<M, T>;
87 skip(skip?: number): QuerySingleNull<M, T>;
88 lean(lean?: boolean): QuerySingleNull<M, T>;
89 if(condition: boolean): QuerySingleNull<M, T>;
90 endif(): QuerySingleNull<M, T>;
91 cache(options: QueryOptions['cache']): QuerySingleNull<M, T>;
92 include(column: string, select?: string): QuerySingleNull<M, T>;
93 transaction(transaction?: Transaction): QuerySingleNull<M, T>;
94 using(node: 'master' | 'read'): QuerySingleNull<M, T>;
95 index_hint(hint: string): QuerySingleNull<M, T>;
96 exec(options?: {
97 skip_log?: boolean;
98 }): PromiseLike<T | null>;
99 stream(): stream.Readable;
100 explain(): PromiseLike<any>;
101 count(): PromiseLike<number>;
102 update(updates: object): PromiseLike<number>;
103 upsert(updates: object): PromiseLike<void>;
104 delete(options?: any): PromiseLike<number>;
105}
106export interface QueryArray<M extends BaseModel, T = M> extends PromiseLike<T[]> {
107 clone(): QueryArray<M, T>;
108 find(id: RecordID): QuerySingle<M, T>;
109 find(id: RecordID[]): QueryArray<M, T>;
110 findPreserve(id: RecordID[]): QueryArray<M, T>;
111 near(target: object): QueryArray<M, T>;
112 where(condition?: object): QueryArray<M, T>;
113 select<K extends ModelColumnNamesWithId<M>>(columns: K[]): QueryArray<M, Pick<M, K>>;
114 select<K extends ModelColumnNamesWithId<M>>(columns?: string): QueryArray<M, Pick<M, K>>;
115 selectSingle<K extends ModelColumnNamesWithId<M>>(column: K): QueryArray<M, M[K]>;
116 order(orders?: string): QueryArray<M, T>;
117 group<G extends ModelColumnNamesWithId<M>, F>(group_by: G | G[], fields?: F): QueryArray<M, {
118 [field in keyof F]: number;
119 } & Pick<M, G>>;
120 group<F>(group_by: null, fields?: F): QueryArray<M, {
121 [field in keyof F]: number;
122 }>;
123 group<U>(group_by: string | null, fields?: object): QueryArray<M, U>;
124 one(): QuerySingleNull<M, T>;
125 limit(limit?: number): QueryArray<M, T>;
126 skip(skip?: number): QueryArray<M, T>;
127 lean(lean?: boolean): QueryArray<M, T>;
128 if(condition: boolean): QueryArray<M, T>;
129 endif(): QueryArray<M, T>;
130 cache(options: QueryOptions['cache']): QueryArray<M, T>;
131 include(column: string, select?: string): QueryArray<M, T>;
132 transaction(transaction?: Transaction): QueryArray<M, T>;
133 using(node: 'master' | 'read'): QueryArray<M, T>;
134 index_hint(hint: string): QueryArray<M, T>;
135 exec(options?: {
136 skip_log?: boolean;
137 }): PromiseLike<T[]>;
138 stream(): stream.Readable;
139 explain(): PromiseLike<any>;
140 count(): PromiseLike<number>;
141 update(updates: object): PromiseLike<number>;
142 upsert(updates: object): PromiseLike<void>;
143 delete(options?: any): PromiseLike<number>;
144}
145/**
146 * Collects conditions to query
147 */
148declare class Query<M extends BaseModel, T = M> implements QuerySingle<M, T>, QueryArray<M, T> {
149 private _model;
150 private _name;
151 private _connection;
152 private _adapter;
153 private _ifs;
154 private _current_if;
155 private _options;
156 private _conditions;
157 private _includes;
158 private _id;
159 private _find_single_id;
160 private _preserve_order_ids?;
161 private _used;
162 /**
163 * Creates a query instance
164 */
165 constructor(model: typeof BaseModel);
166 clone(): Query<M, T>;
167 /**
168 * Finds a record by id
169 */
170 find(id: RecordID): QuerySingle<M, T>;
171 find(id: RecordID[]): QueryArray<M, T>;
172 /**
173 * Finds records by ids while preserving order.
174 */
175 findPreserve(ids: RecordID[]): QueryArray<M, T>;
176 /**
177 * Finds records near target
178 */
179 near(target: object): this;
180 /**
181 * Finds records by condition
182 */
183 where(condition?: object): this;
184 /**
185 * Selects columns for result
186 */
187 select<K extends ModelColumnNamesWithId<M>>(columns?: string | string[]): QuerySingle<M, Pick<M, K>>;
188 select<K extends ModelColumnNamesWithId<M>>(columns?: string | string[]): QueryArray<M, Pick<M, K>>;
189 selectSingle<K extends ModelColumnNamesWithId<M>>(column: K): QuerySingle<M, M[K]>;
190 selectSingle<K extends ModelColumnNamesWithId<M>>(column: K): QueryArray<M, M[K]>;
191 /**
192 * Specifies orders of result
193 */
194 order(orders?: string): this;
195 /**
196 * Groups result records
197 */
198 group<U>(group_by: string | string[] | null, fields?: object): QuerySingle<M, U>;
199 group<U>(group_by: string | string[] | null, fields?: object): QueryArray<M, U>;
200 /**
201 * Returns only one record (or null if does not exists).
202 *
203 * This is different from limit(1). limit(1) returns array of length 1 while this returns an instance.
204 */
205 one(): this;
206 /**
207 * Sets limit of query
208 */
209 limit(limit: number): this;
210 /**
211 * Sets skip of query
212 */
213 skip(skip: number): this;
214 /**
215 * Returns raw instances instead of model instances
216 * @see Query::exec
217 */
218 lean(lean?: boolean): this;
219 /**
220 * Makes a part of the query chain conditional
221 * @see Query::endif
222 */
223 if(condition: boolean): this;
224 /**
225 * Ends last if
226 * @chainable
227 * @see Query::if
228 */
229 endif(): this;
230 /**
231 * Cache result.
232 *
233 * If cache of key exists, actual query does not performed.
234 * If cache does not exist, query result will be saved in cache.
235 *
236 * Redis is used to cache.
237 */
238 cache(options: QueryOptions['cache']): this;
239 /**
240 * Returns associated objects also
241 */
242 include(column: string, select?: string): this;
243 transaction(transaction?: Transaction): this;
244 using(node: 'master' | 'read'): this;
245 index_hint(hint: string): this;
246 /**
247 * Executes the query
248 * @see AdapterBase::findById
249 * @see AdapterBase::find
250 */
251 exec(options?: {
252 skip_log?: boolean;
253 }): Promise<any>;
254 /**
255 * Executes the query and returns a readable stream
256 * @see AdapterBase::findById
257 * @see AdapterBase::find
258 */
259 stream(): stream.Readable;
260 /**
261 * Explains the query
262 */
263 explain(): Promise<any>;
264 /**
265 * Executes the query as a promise (.then == .exec().then)
266 */
267 then<TResult1 = T, TResult2 = never>(onfulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | ((value: T[]) => TResult1 | PromiseLike<TResult1>) | undefined | null, onrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | undefined | null): PromiseLike<TResult1 | TResult2>;
268 /**
269 * Executes the query as a count operation
270 * @see AdapterBase::count
271 */
272 count(): Promise<number>;
273 /**
274 * Executes the query as a update operation
275 * @see AdapterBase::update
276 */
277 update(updates: any): Promise<number>;
278 /**
279 * Executes the query as an insert or update operation
280 * @see AdapterBase::upsert
281 */
282 upsert(updates: any): Promise<void>;
283 /**
284 * Executes the query as a delete operation
285 * @see AdapterBase::delete
286 */
287 delete(options?: any): Promise<number>;
288 private _exec;
289 private _getAdapterFindOptions;
290 private _execAndInclude;
291 private _validateAndBuildSaveData;
292 private _doIntegrityActions;
293 private _doArchiveAndIntegrity;
294 private _addCondition;
295 private _setUsed;
296}
297export { Query };