/*
* Copyright DataStax, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { types } from '../types';
import { Client } from '../../';
import Long = types.Long;
type UpperCaseLetters = "A" | "B" | "C" | "D" | "E" | "F" | "G" | "H" | "I" | "J" | "K" | "L" | "M" | "N" | "O" | "P" | "Q" | "R" | "S" | "T" | "U" | "V" | "W" | "X" | "Y" | "Z";
type lowerCaseLetters = "a" | "b" | "c" | "d" | "e" | "f" | "g" | "h" | "i" | "j" | "k" | "l" | "m" | "n" | "o" | "p" | "q" | "r" | "s" | "t" | "u" | "v" | "w" | "x" | "y" | "z";
type snakeCaseConditions<
P extends string,
S1 extends string,
S2 extends string,
> = S1 extends UpperCaseLetters
? P extends ""
? false : P extends lowerCaseLetters
? true : S2 extends lowerCaseLetters
? true : false
: false;
type snakeCase<
S extends string,
P extends string = ""> = S extends `${infer S1}${infer S2}${infer S3}`
? snakeCaseConditions
extends true
? `_${Lowercase}${snakeCase<`${S2}${S3}`, S1>}`
: `${Lowercase}${snakeCase<`${S2}${S3}`, S1>}`
: Lowercase;
type getKeys = (keyof T)[];
export namespace mapping {
interface TableMappings {
getColumnName(propName: string): string;
getPropertyName(columnName: string): string;
objectToArray(obj: any): any[];
objectToFixedCasing(obj: any): any;
objectToTableCasing(obj: any): any;
newObjectInstance(): any;
}
class DefaultTableMappings implements TableMappings {
getColumnName(propName: string): string;
getPropertyName(columnName: string): string;
objectToArray(obj: any): any[];
objectToFixedCasing(obj: any): any;
objectToTableCasing(obj: any): any;
newObjectInstance(): any;
}
class UnderscoreCqlToCamelCaseMappings implements TableMappings {
private convertLongsToStrings: boolean;
constructor(convertLongsToStrings?: boolean);
getColumnName(propName: string): string;
getPropertyName(columnName: string): string;
objectToArray(obj: any): any[];
objectToFixedCasing(obj: any): any;
objectToTableCasing(obj: any): any;
newObjectInstance(): any;
}
class UnderscoreCqlToPascalCaseMappings implements TableMappings {
private convertLongsToStrings: boolean;
constructor(convertLongsToStrings?: boolean);
getColumnName(propName: string): string;
getPropertyName(columnName: string): string;
objectToArray(obj: any): any[];
objectToFixedCasing(obj: any): any;
objectToTableCasing(obj: any): any;
newObjectInstance(): any;
}
interface Result extends Iterator {
wasApplied(): boolean;
first(): T | null;
forEach(callback: (currentValue: T, index: number) => void, thisArg?: any): void;
toArray(): T[];
}
type MappingExecutionOptions = {
executionProfile?: string;
isIdempotent?: boolean;
logged?: boolean;
timestamp?: number | Long;
fetchSize?: number;
pageState?: number;
};
interface ModelTables {
name: string;
isView: boolean;
}
class Mapper {
constructor(client: Client, options?: MappingOptions);
batch(items: ModelBatchItem[], executionOptions?: string | MappingExecutionOptions): Promise;
forModel(name: string): ModelMapper;
}
type MappingOptions = {
models: { [key: string]: ModelOptions; };
};
type FindDocInfo = {
fields?: getKeys;
orderBy?: { [key: string]: string; };
limit?: number;
allowFiltering?: boolean;
};
type InsertDocInfo = {
fields?: getKeys;
ttl?: number;
ifNotExists?: boolean;
};
type UpdateDocInfo = {
fields?: getKeys;
ttl?: number;
ifExists?: boolean;
when?: { [key: string]: any; };
orderBy?: { [key: string]: string; };
limit?: number;
deleteOnlyColumns?: boolean;
};
type RemoveDocInfo = {
fields?: getKeys;
ttl?: number;
ifExists?: boolean;
when?: { [key: string]: any; };
deleteOnlyColumns?: boolean;
};
type ModelOptions = {
tables?: string[] | ModelTables[];
mappings?: TableMappings;
columns?: { [key: string]: string | ModelColumnOptions; };
keyspace?: string;
};
type ModelColumnOptions = {
name: string;
toModel?: (columnValue: any) => any;
fromModel?: (modelValue: any) => any;
};
interface ModelBatchItem {
}
interface ModelBatchMapper {
insert(doc: any, docInfo?: InsertDocInfo): ModelBatchItem;
remove(doc: any, docInfo?: RemoveDocInfo): ModelBatchItem;
update(doc: any, docInfo?: UpdateDocInfo): ModelBatchItem;
}
interface ModelMapper {
name: string;
batching: ModelBatchMapper;
get(doc: Partial, docInfo?: { fields?: getKeys, allowFiltering?: boolean; }, executionOptions?: string | MappingExecutionOptions): Promise;
find(doc: Partial, docInfo?: FindDocInfo, executionOptions?: string | MappingExecutionOptions): Promise>;
findAll(docInfo?: FindDocInfo, executionOptions?: string | MappingExecutionOptions): Promise>;
insert(doc: T, docInfo?: InsertDocInfo, executionOptions?: string | MappingExecutionOptions): Promise>;
update(doc: Partial, docInfo?: UpdateDocInfo, executionOptions?: string | MappingExecutionOptions): Promise>;
remove(doc: Partial, docInfo?: RemoveDocInfo, executionOptions?: string | MappingExecutionOptions): Promise>;
mapWithQuery(
query: string,
paramsHandler: (doc: any) => any[],
executionOptions?: string | MappingExecutionOptions
): (doc: any, executionOptions?: string | MappingExecutionOptions) => Promise>;
}
namespace q {
interface QueryOperator {
}
function in_(arr: any): QueryOperator;
function gt(value: any): QueryOperator;
function gte(value: any): QueryOperator;
function lt(value: any): QueryOperator;
function lte(value: any): QueryOperator;
function notEq(value: any): QueryOperator;
function and(condition1: any, condition2: any): QueryOperator;
function incr(value: any): QueryOperator;
function decr(value: any): QueryOperator;
function append(value: any): QueryOperator;
function prepend(value: any): QueryOperator;
function remove(value: any): QueryOperator;
}
}