/**
 * Copyright (c) 2020-present, Goldman Sachs
 *
 * 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 { type Hashable } from '@finos/legend-shared';
import type { GroupByMapping } from '../mapping/GroupByMapping.js';
import type { FilterMapping } from '../mapping/FilterMapping.js';
import type { JoinReference } from './JoinReference.js';
import type { TableReference } from './TableReference.js';
import type { ViewReference } from './ViewReference.js';
import type { ColumnReference } from './ColumnReference.js';
import type { Database } from './Database.js';
import type { StereotypeReference } from '../../../domain/StereotypeReference.js';
import type { TaggedValue } from '../../../domain/TaggedValue.js';
export declare abstract class RelationalOperationElement {
    abstract get hashCode(): string;
    stereotypes: StereotypeReference[];
    taggedValues: TaggedValue[];
}
export declare abstract class Relation extends RelationalOperationElement {
    columns: RelationalOperationElement[];
    get hashCode(): string;
}
export declare abstract class NamedRelation extends Relation {
    name: string;
    constructor(name: string);
}
declare abstract class Function extends RelationalOperationElement {
}
export declare abstract class Operation extends Function {
}
export declare class DynaFunction extends Operation {
    name: string;
    parameters: RelationalOperationElement[];
    constructor(name: string);
    get hashCode(): string;
}
export interface RelationalMappingSpecification {
    filter?: FilterMapping | undefined;
    distinct?: boolean | undefined;
    groupBy?: GroupByMapping | undefined;
    mainTableAlias?: TableAlias | undefined;
}
export declare enum JoinType {
    INNER = "INNER",
    LEFT_OUTER = "LEFT_OUTER",
    RIGHT_OUTER = "RIGHT_OUTER",
    OUTER = "OUTER"
}
export declare class JoinTreeNode {
    /**
     * This field is required in PURE
     *
     * @discrepancy model
     */
    alias?: TableAlias | undefined;
    children: JoinTreeNode[];
    join: JoinReference;
    /**
     * For convenience, we use a Typescript enum instead of the native
     * Pure enumeration meta::relational::metamodel::join::JoinType
     *
     * @discrepancy model
     */
    joinType?: JoinType | undefined;
    constructor(join: JoinReference, joinType?: JoinType, alias?: TableAlias);
    get hashCode(): string;
}
/**
 * We could potentially include logic to throw error if tree structure is detected
 */
export declare const extractLine: (joinTreeNode: JoinTreeNode) => JoinTreeNode[];
export declare class RelationalOperationElementWithJoin extends RelationalOperationElement {
    relationalOperationElement?: RelationalOperationElement | undefined;
    joinTreeNode?: JoinTreeNode | undefined;
    get hashCode(): string;
}
export declare class TableAlias extends RelationalOperationElement implements Hashable {
    relation: TableReference | ViewReference;
    name: string;
    database?: Database | undefined;
    isSelfJoinTarget: boolean;
    get hashCode(): string;
}
export declare class TableAliasColumn extends RelationalOperationElement {
    alias: TableAlias;
    column: ColumnReference;
    columnName?: string | undefined;
    get hashCode(): string;
}
export declare class Literal extends RelationalOperationElement {
    value: string | number | RelationalOperationElement;
    constructor(value: string | number | RelationalOperationElement);
    get hashCode(): string;
}
export declare class LiteralList extends RelationalOperationElement {
    values: Literal[];
    get hashCode(): string;
}
export {};
//# sourceMappingURL=RelationalOperationElement.d.ts.map