1 |
|
2 | import stream from 'stream';
|
3 | import { BaseModel, ModelColumnNamesWithId } from './model';
|
4 | import { Transaction } from './transaction';
|
5 | import { RecordID } from './types';
|
6 | interface 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 | }
|
28 | export 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 | }
|
67 | interface 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 | }
|
106 | export 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 |
|
147 |
|
148 | declare 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 |
|
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 | }
|
297 | export { Query };
|