import { EntityDict, OperateOption, Q_FullTextValue, Ref, RefOrExpression, SelectOption, StorageSchema } from "oak-domain/lib/types"; import { EntityDict as BaseEntityDict } from 'oak-domain/lib/base-app-domain'; import { DataType } from "oak-domain/lib/types/schema/DataTypes"; import { CreateEntityOption } from './types/Translator'; export interface SqlSelectOption extends SelectOption { } export interface SqlOperateOption extends OperateOption { } export declare abstract class SqlTranslator { readonly schema: StorageSchema; constructor(schema: StorageSchema); private makeFullSchema; protected abstract getDefaultSelectFilter(alias: string, option?: OP): string; protected abstract translateAttrProjection(dataType: DataType, alias: string, attr: string): string; protected abstract translateObjectProjection(projection: Record, alias: string, attr: string, prefix: string): string; protected abstract translateAttrValue(dataType: DataType | Ref, value: any): string; protected abstract translateFullTextSearch(value: Q_FullTextValue, entity: T, alias: string): string; abstract translateCreateEntity(entity: T, option: CreateEntityOption): string[]; protected abstract translateObjectPredicate(predicate: Record, alias: string, attr: string): string; protected abstract populateSelectStmt(projectionText: string, fromText: string, aliasDict: Record, filterText: string, sorterText?: string, groupByText?: string, indexFrom?: number, count?: number, option?: OP, selection?: ED[T]['Selection'], aggregation?: ED[T]['Aggregation']): string; protected abstract populateUpdateStmt(updateText: string, fromText: string, aliasDict: Record, filterText: string, sorterText?: string, indexFrom?: number, count?: number, option?: OP): string; protected abstract populateRemoveStmt(updateText: string, fromText: string, aliasDict: Record, filterText: string, sorterText?: string, indexFrom?: number, count?: number, option?: OP): string; protected abstract translateExpression(entity: T, alias: string, expression: RefOrExpression, refDict: Record): string; protected getStorageName(entity: T): string; translateInsert(entity: T, data: ED[T]['CreateMulti']['data']): string; /** * analyze the join relations in projection/query/sort * 所有的层次关系都当成left join处理,如果有内表为空的情况,请手动处理 * { * b: { * name: { * $exists: false, * } * } * } * 这样的query会把内表为空的行也返回 * @param param0 */ private analyzeJoin; /** * 对like模式中的特殊字符进行转义 * 例如 % 和 _,以防止被当成通配符处理 * @param pattern like模式字符串 * @returns 转义后的字符串 */ escapeLikePattern(pattern: string): string; private translateComparison; private translateEvaluation; protected translatePredicate(predicate: string, value: any, type?: DataType | Ref): string; protected translateFilter(entity: T, filter: ED[T]['Selection']['filter'], aliasDict: Record, filterRefAlias: Record, initialNumber: number, option?: OP): { stmt: string; currentNumber: number; }; private translateSorter; private translateProjection; private translateSelectInner; translateSelect(entity: T, selection: ED[T]['Selection'], option?: OP): string; translateWhere(entity: T, selection: ED[T]['Selection'], option?: OP): string; translateAggregate(entity: T, aggregation: ED[T]['Aggregation'], option?: OP): string; translateCount(entity: T, selection: Pick, option?: OP): string; translateRemove(entity: T, operation: ED[T]['Remove'], option?: OP): string; translateUpdate(entity: T, operation: ED[T]['Update'], option?: OP): string; translateDestroyEntity(entity: string, truncate?: boolean): string; escapeStringValue(value: string): string; /**比较两段sql是否完全一致,这里是把所有的空格去掉了 */ compareSql(sql1: string, sql2: string): boolean; quoteIdentifier(name: string): string; }