All files / src/abap/types/basic table_type.ts

96.7% Statements 88/91
88% Branches 22/25
90% Functions 9/10
96.7% Lines 88/91

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 911x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 669x 669x 669x 669x 1x 1x 668x 1x 1x 18x 18x 1x 1x 457x 457x 1x 1x 3x 3x 1x 1x 1355x 1355x 1x 1x 4x 4x 4x 1x 1x 5x 5x 5x   5x 5x 5x 5x 1x 1x 696x 696x 696x 2x 2x 694x 694x 1x 1x 11x 11x 1x 1x     1x
import {AbstractType} from "./_abstract_type";
 
export enum TableAccessType {
  standard = "STANDARD",
  sorted = "SORTED",
  hashed = "HASHED",
  index = "INDEX",
  any = "ANY",
}
 
export enum TableKeyType {
  default = "DEFAULT",
  user = "USER",
  empty = "EMPTY",
}
 
export type ITableKey = {
  name: string,
  type: TableAccessType,
  keyFields: string[],
  isUnique: boolean,
};
 
export type ITableOptions = {
  withHeader: boolean,
  keyType: TableKeyType,
  primaryKey?: ITableKey,
  secondary?: ITableKey[],
};
 
export class TableType extends AbstractType {
  private readonly rowType: AbstractType;
  private readonly options: ITableOptions;
 
  public constructor(rowType: AbstractType, options: ITableOptions, qualifiedName?: string) {
    super({qualifiedName: qualifiedName});
    this.rowType = rowType;
    this.options = options;
    if (options.primaryKey?.type === TableAccessType.standard && options.primaryKey.isUnique === true) {
      throw new Error("STANDARD tables cannot have UNIQUE key");
    }
  }
 
  public getOptions(): ITableOptions {
    return this.options;
  }
 
  public isWithHeader(): boolean {
    return this.options.withHeader;
  }
 
  public getAccessType(): TableAccessType | undefined {
    return this.options.primaryKey?.type;
  }
 
  public getRowType(): AbstractType {
    return this.rowType;
  }
 
  public toABAP(): string {
// todo, this is used for downport, so use default key for now
    return "STANDARD TABLE OF " + this.rowType.toABAP() + " WITH DEFAULT KEY";
  }
 
  public toText(level: number) {
    const type = this.rowType;
 
    if (this.options.withHeader === true) {
      return "Table with header of " + type.toText(level + 1);
    } else {
      return "Table of " + type.toText(level + 1);
    }
  }
 
  public isGeneric() {
    if (this.options.primaryKey?.type !== TableAccessType.standard
        && this.options.keyType === TableKeyType.user
        && this.options.primaryKey?.keyFields.length === 0) {
      return true;
    }
    return this.rowType.isGeneric();
  }
 
  public containsVoid() {
    return this.rowType.containsVoid();
  }
 
  public toCDS() {
    return "abap.TODO_TABLE";
  }
}