import {
  type EntityKey,
  type EntityProperty,
  type MetadataStorage,
  type RawQueryFragmentSymbol,
  type EntityName,
} from '@mikro-orm/core';
import type { ICriteriaNode, ICriteriaNodeProcessOptions, IQueryBuilder } from '../typings.js';
/**
 * Helper for working with deeply nested where/orderBy/having criteria. Uses composite pattern to build tree from the payload.
 * Auto-joins relations and converts payload from { books: { publisher: { name: '...' } } } to { 'publisher_alias.name': '...' }
 * @internal
 */
export declare class CriteriaNode<T extends object> implements ICriteriaNode<T> {
  protected readonly metadata: MetadataStorage;
  readonly entityName: EntityName<T>;
  readonly parent?: ICriteriaNode<T> | undefined;
  readonly key?: (EntityKey<T> | RawQueryFragmentSymbol) | undefined;
  readonly validate: boolean;
  readonly strict: boolean;
  payload: any;
  prop?: EntityProperty<T>;
  index?: number;
  constructor(
    metadata: MetadataStorage,
    entityName: EntityName<T>,
    parent?: ICriteriaNode<T> | undefined,
    key?: (EntityKey<T> | RawQueryFragmentSymbol) | undefined,
    validate?: boolean,
    strict?: boolean,
  );
  process(qb: IQueryBuilder<T>, options?: ICriteriaNodeProcessOptions): any;
  unwrap(): any;
  shouldInline(payload: any): boolean;
  willAutoJoin(qb: IQueryBuilder<T>, alias?: string, options?: ICriteriaNodeProcessOptions): boolean;
  shouldRename(payload: any): boolean;
  renameFieldToPK<T>(qb: IQueryBuilder<T>, ownerAlias?: string): string;
  getPath(opts?: { addIndex?: boolean; parentPath?: string }): string;
  private isPivotJoin;
  getPivotPath(path: string): string;
  aliased(field: string, alias?: string): string;
  isStrict(): boolean;
}
