ottoman
Version:
Ottoman Couchbase ODM
518 lines (517 loc) • 13.7 kB
TypeScript
import { BaseQuery } from './base-query';
import { IConditionExpr, IGroupBy, IIndexOnParams, IIndexWithParams, IndexType, ISelectType, LetExprType, LogicalWhereExpr, QueryBuildOptionsType, SortType } from './interface/query.types';
import { QueryOptions, QueryResult } from 'couchbase';
export declare class Query extends BaseQuery {
/**
* SELECT Expression.
*/
private selectExpr?;
/**
* WHERE Expression.
*/
private whereExpr?;
/**
* ORDER BY Expression.
*/
private orderExpr?;
/**
* LIMIT Expression.
*/
private limitExpr?;
/**
* OFFSET Expression.
*/
private offSetExpr?;
/**
* LET Expression.
*/
private letExpr?;
/**
* GROUP BY Expression.
*/
private groupByExpr?;
/**
* LETTING Expression.
*/
private lettingExpr?;
/**
* HAVING Expression.
*/
private havingExpr?;
/**
* Plain JOIN Expression.
*/
private plainJoinExpr?;
/**
* USE Expression.
*/
private useKeysExpr?;
/**
* Available query types.
*/
private queryType?;
/**
* INDEX ON Expression.
*/
private indexOn?;
/**
* Types of supported Index statements.
*/
private indexType?;
/**
* Index name.
*/
private indexName?;
/**
* INDEX USING GSI Expression.
*/
private indexUsingGSI?;
/**
* INDEX WITH Expression.
*/
private indexWith?;
/**
* @summary Create an instance of Query.
* @name Query
* @class
* @public
*
* @param conditions List of SELECT clause conditions
* @param collection Collection name
* @returns Query
*
* @example
* ```ts
* const query = new Query({
* $select: [{ $field: 'address' }],
* $where: {
* $nill: [
* { address: { $like: '%57-59%' } },
* { free_breakfast: true },
* { free_lunch: [1] }
* ]
* }
* },
* 'travel-sample');
* ```
*/
constructor(conditions: IConditionExpr, collection: string);
/**
* Add result selectors to SELECT clause.
* @method
* @public
*
* @example
* ```ts
* const query = new Query({}, 'travel-sample');
* const result = query.select([{ $field: 'address' }]).build()
* console.log(result)
* ```
* ```sql
* SELECT address
* FROM `travel-sample`
* ```
*/
select(value?: ISelectType[] | string | undefined): Query;
/**
* Add index type and name to INDEX clause.
* @method
* @public
*
* @example
* ```ts
* const result = new Query({}, 'travel-sample')
* .index('DROP', 'travel_sample_id_test')
* .build();
* console.log(result)
* ```
* ```sql
* DROP INDEX `travel-sample`.`travel_sample_id_test`
* ```
*/
index(type: IndexType, name: string): Query;
/**
* Add items to ON clause in INDEX clause.
* @method
* @public
*
* @example
* ```ts
* const on = [{ name: 'travel-sample.callsing', sort: 'ASC' }];
* const result = new Query({}, 'travel-sample')
* .index('CREATE', 'travel_sample_id_test')
* .on(on)
* .build();
* console.log(result)
* ```
* ```sql
* CREATE INDEX `travel_sample_id_test` ON `travel-sample` (`travel-sample.callsing`['ASC'])
* ```
**/
on(value: IIndexOnParams[]): Query;
/**
* Create INDEX using General Secondary Index (GSI).
* @method
* @public
*
* @example
* ```ts
* const result = new Query({}, 'travel-sample')
* .index('CREATE', 'travel_sample_id_test')
* .usingGSI()
* .build();
* console.log(result)
* ```
* ```sql
* CREATE INDEX `travel_sample_id_test` USING GSI
* ```
**/
usingGSI(): Query;
/**
* Add items to WITH clause in INDEX clause.
* @method
* @public
*
* @example
* ```ts
* const withExpr = { nodes: ['192.168.1.1:8078'], defer_build: true, num_replica: 2 };
* const result = new Query({}, 'travel-sample')
* .index('CREATE', 'travel_sample_id_test')
* .with(withExpr)
* .build();
* console.log(result)
* ```
* ```sql
* CREATE INDEX `travel_sample_id_test`
* WITH {'nodes': ['192.168.1.1:8078'],'defer_build': true,'num_replica': 2}
* ```
**/
with(value: IIndexWithParams): Query;
/**
* Add WHERE expression to SELECT clause.
* @method
* @public
*
* @example
* ```ts
* const expr_where = {
* $or: [
* { address: { $like: '%57-59%' } },
* { free_breakfast: true },
* { name: { $eq: 'John', $ignoreCase: true } }
* ]
* };
* const query = new Query({}, 'travel-sample');
* const result = query.select([{ $field: 'address' }])
* .where(expr_where)
* .build()
* console.log(result)
* ```
* ```sql
* SELECT address
* FROM `travel-sample`
* WHERE (address LIKE "%57-59%" OR free_breakfast = true OR (LOWER(name) = LOWER("John")))
* ```
**/
where(value: LogicalWhereExpr): Query;
/**
* Add JOIN expression to SELECT clause.
* @method
* @public
*
* @example
* ```tS
* const query = new Query({}, 'beer-sample brewery');
* const result = query.select([{ $field: 'address' }])
* .plainJoin(
* 'JOIN `beer-sample` beer ON beer.brewery_id = LOWER(REPLACE(brewery.name, " ", "_"))'
* )
* .build()
* console.log(result)
* ```
* ```sql
* SELECT beer.name
* FROM `beer-sample` brewery
* JOIN `beer-sample` beer ON beer.brewery_id = LOWER(REPLACE(brewery.name, " ", "_"))
* ```
*/
plainJoin(value: string): Query;
/**
* Add ORDER BY expression to SELECT clause.
* @method
* @public
*
* @example
* ```ts
* const query = new Query({}, 'travel-sample');
* const result = query.select([{ $field: 'address' }])
* .orderBy({ size: 'DESC' })
* .build()
* console.log(result)
* ```
* ```sql
* SELECT address
* FROM `travel-sample`
* ORDER BY size = 'DESC'
* ```
*/
orderBy(value: Record<string, SortType>): Query;
/**
* Add LIMIT expression to SELECT clause.
* @method
* @public
*
* @example
* ```ts
* const query = new Query({}, 'travel-sample');
* const result = query.select([{ $field: 'address' }])
* .limit(10)
* .build()
* console.log(result)
* ```
* ```sql
* SELECT address
* FROM `travel-sample`
* LIMIT 10
* ```
**/
limit(value: number): Query;
/**
* Add OFFSET expression to SELECT clause.
* @method
* @public
*
* @example
* ```ts
* const query = new Query({}, 'travel-sample');
* const result = query.select([{ $field: 'address' }])
* .offset(10)
* .build()
* console.log(result)
* ```
* ```sql
* SELECT address
* FROM `travel-sample`
* OFFSET 10
* ```
**/
offset(value: number): Query;
/**
* Add LET expression to SELECT clause.
* @method
* @public
*
* @example
*
* ```ts
* // SELECT expression definition
* const selectExpr = 't1.airportname, t1.geo.lat, t1.geo.lon, t1.city, t1.type';
*
* // LET expression definition
* const letExpr: LetExprType = {
* min_lat: 71,
* max_lat: 'ABS(t1.geo.lon)*4+1',
* place: '(SELECT RAW t2.country FROM `travel-sample` t2 WHERE t2.type = "landmark")',
* };
*
* // WHERE expression definition
* const whereExpr: LogicalWhereExpr = {
* $and: [
* { 't1.type': 'airport' },
* { 't1.geo.lat': { $gt: { $field: 'min_lat' } } },
* { 't1.geo.lat': { $lt: { $field: 'max_lat' } } },
* { 't1.country': { $in: { $field: 'place' } } },
* ],
* };
*
* // QUERY creation
* const query = new Query({}, 'travel-sample t1')
* .select(selectExpr)
* .let(letExpr)
* .where(whereExpr)
* .build();
*
* console.log(query);
*
* // QUERY output
* ```
* ```sql
* SELECT t1.airportname,
* t1.geo.lat,
* t1.geo.lon,
* t1.city,
* t1.type
* FROM `travel-sample` t1
* LET min_lat=71,
* max_lat=ABS(t1.geo.lon)*4+1,
* place=(
* SELECT RAW t2.country
* FROM `travel-sample` t2
* WHERE t2.type = "landmark")
* WHERE (t1.type="airport"
* AND t1.geo.lat>min_lat
* AND t1.geo.lat<max_lat
* AND t1.country IN place);
* ```
*
* ```ts
* // OTTOMAN initialization
* const ottoman = getDefaultInstance();
* await startInTest(ottoman);
*
* // QUERY execution
* const { rows } = await ottoman.query(query);
*
* // RESULTS
* console.log(rows)
* ```
* ```sh
* [
* {
* airportname: 'Wiley Post Will Rogers Mem',
* city: 'Barrow',
* lat: 71.285446,
* lon: -156.766003,
* type: 'airport',
* },
* {
* airportname: 'Dillant Hopkins Airport',
* city: 'Keene',
* lat: 72.270833,
* lon: 42.898333,
* type: 'airport',
* },
* ]
* ```
*/
let(value: LetExprType): Query;
/**
* Add GROUP BY expression to SELECT clause.
* @method
* @public
*
* @example
* ```ts
* const groupByExpr = [{ expr: 'COUNT(amount_val)', as: 'amount' }];
* const query = new Query({}, 'travel-sample');
* const result = query.select([{ $field: 'address' }])
* .groupBy(groupByExpr)
* .build()
* console.log(result)
* ```
* ```sql
* SELECT address
* FROM `travel-sample`
* GROUP BY COUNT(amount) AS amount
* ```
*/
groupBy(value: IGroupBy[]): Query;
/**
* Add LETTING expression to GROUP BY clause.
* @method
* @public
*
* @example
* ```ts
* const groupByExpr = [{ expr: 'COUNT(amount_val)', as: 'amount' }];
* const letExpr = { amount_val: 10 };
* const query = new Query({}, 'travel-sample');
* const result = query.select([{ $field: 'address' }])
* .groupBy(groupByExpr)
* .let(letExpr)
* .build()
* console.log(result)
* ```
* ```sql
* SELECT address
* FROM `travel-sample`
* GROUP BY COUNT(amount) AS amount LETTING amount = 10
* ```
*/
letting(value: LetExprType): Query;
/**
* Add HAVING expression to GROUP BY clause.
* @method
* @public
*
* @example
* ```ts
* const groupByExpr = [{ expr: 'COUNT(amount_val)', as: 'amount' }];
* const having = { address: { $like: '%58%' } };
* const query = new Query({}, 'travel-sample');
* const result = query.select([{ $field: 'address' }])
* .groupBy(groupByExpr)
* .having(having)
* .build()
* console.log(result)
* ```
* ```sql
* SELECT address
* FROM `travel-sample`
* GROUP BY COUNT(amount) AS amount
* HAVING address LIKE '%58%'
* ```
*/
having(value: LogicalWhereExpr): Query;
/**
* Add USE KEYS expression to SELECT clause.
* @method
* @public
*
* @example
* ```ts
* const query = new Query({}, 'travel-sample');
* const result = query.select([{ $field: 'address' }])
* .useKeys(['airlineR_8093'])
* .build()
* console.log(result)
* ```
* ```sql
* SELECT address
* FROM `travel-sample` USE KEYS ['airlineR_8093']
* ```
*/
useKeys(value: string[]): Query;
/**
* Converts the conditional parameters passed to the constructor to the properties of the N1QL Query.
* @method
* @public
*
*/
compileFromConditions(conditionals: IConditionExpr): void;
/**
* Build a N1QL query from the defined parameters.
*
* Can also use `ignoreCase` as part of the `build` method, this will always prioritize the `$ignoreCase` value defined in clause.
* @example
* ```ts
* const expr_where = {
* $or: [
* { address: { $like: '%57-59%', $ignoreCase: false } }, // ignoreCase will not be applied
* { free_breakfast: true },
* { name: 'John' } // ignoreCase will be applied
* ],
* };
* const query = new Query({}, 'travel-sample');
* const result = query.select([{ $field: 'address' }])
* .where(expr_where)
* .build({ ignoreCase: true }); // ignore case is enabled for where clause elements
* console.log(result)
* ```
* ```sql
* SELECT address
* FROM `travel-sample`
* WHERE (address LIKE "%57-59%" OR free_breakfast = true OR `(LOWER(name) = LOWER("John"))`)
* ```
*
* @method
* @public
*
*/
build(options?: QueryBuildOptionsType): string;
execute<Result = any>(options?: QueryBuildOptionsType, queryOptions?: QueryOptions, ottomanInstance?: import("../ottoman/ottoman").Ottoman): Promise<QueryResult<Result>> | Promise<Result>;
get conditions(): IConditionExpr;
set conditions(value: IConditionExpr);
get collection(): string;
set collection(value: string);
}