result.ts 8.34 KiB
import { JalhydObject } from "../jalhyd_object";
import { NamedIterableValues, NumberIterator } from "../param/param-value-iterator";
import { cLog } from "./log";
import { Message, MessageCode, MessageSeverity } from "./message";
import { ResultElement } from "./resultelement";
/**
 * Résultat global d'un calcul
 * Peut comporter un ou plusieurs Result.
// tslint:disable-next-line:max-classes-per-file
export class Result extends JalhydObject implements NamedIterableValues {
    /**
     * Messages (erreurs, infos, ...)
    private _globalLog: cLog;
    private _resultElements: ResultElement[];
    /**
     * nom de la variable/paramètre calculé
    private _name: string;
    constructor(v?: number | Message | ResultElement, d?: any) {
        super();
        this._globalLog = new cLog();
        this._resultElements = [];
        if (typeof (v) === "number" || v instanceof Message) {
            this._resultElements.push(new ResultElement(v));
        } else if (v instanceof ResultElement) {
            this._resultElements.push(v);
        if (d !== undefined) {
            this.resultElement.extraResults = d;
    public set name(n: string) {
        this._name = n;
    /**
     * retourne le journal de la calculette
    public get globalLog() {
        return this._globalLog;
    /**
     * @return true si il y a au moins un message dans le log global
    public get hasGlobalLog(): boolean {
        return this.globalLog.messages.length > 0;
    /**
     * @return true si il y a au moins un message dans le log global ou dans les ResultElement
    public get hasLog(): boolean {
        return (this.nbResultElements > 0 && this.log.messages.length > 0) || this.hasGlobalLog;
    /**
     * Retourne le résultat du premier ResultElement
    get resultElement(): ResultElement {
        if (this._resultElements.length === 0) {
            throw new Error("appel à la méthode de Result.result() invalide, il n'y a pas au moins un 'ResultElement'");
7172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
} return this._resultElements[0]; } get resultElements(): ResultElement[] { return this._resultElements; } /** * @return true si il existe au moins 1 ResultElement dans le tableau */ get hasResultElements(): boolean { return this._resultElements.length > 0; } /** * @return le résultat de calcul du 1er ResultElement */ get vCalc(): number { return this.resultElement.vCalc; } /** * @return le résultat de calcul du 1er ResultElement */ set vCalc(r: number) { this.resultElement.vCalc = r; } /** * retourne le journal du 1er ResultElement */ public get log() { // return this._globalLog; return this.resultElement.log; } /** * retourne le code du 1er ResultElement */ public get code(): MessageCode { return this.resultElement.code; } /** * retourne les résultats complémentaires du 1er ResultElement */ get extraResults() { return this.resultElement.extraResults; } /** * Extract one ResultElement as a Result * @param i index of the ResultElement */ public extractResult(i: number): Result { if (i < 0 || i >= this._resultElements.length) { throw new Error("Result.extractResult index outside [0;" + (this._resultElements.length - 1) + "]"); } return new Result(this._resultElements[i]); } /** * Renvoie le nombre de résultats dans le tableau de résultats */ public get nbResultElements(): number { return this._resultElements.length; }
141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
/** * Ajoute un ResultElement au tableau * @param r ResultElement à ajouter */ public addResultElement(r: ResultElement) { this._resultElements.push(r); } /** * Insert result r at index i * @param r Result to insert * @param i Index position */ public insertResultElement(r: ResultElement, i: number) { this._resultElements.splice(i, 0, r); } /** * @param name nom du résultat complémentaire * @returns le nombre la taille d'un résultat complémentaire */ public extraResultLength(name: string): number { const r = this.getExtraResult(name); if (r === undefined) { return 0; } return Object.keys(r).length; } public getExtraResult(name: string): any { const res = []; for (const r of this._resultElements) { const er = r.getExtraResult(name); if (er !== undefined) { res.push(er); } } switch (res.length) { case 0: return undefined; case 1: return res[0]; default: throw new Error( "Result.getExtraResult() : il existe plusieurs ResultElement avec" + " un extratresult dont le nom est '" + name + "'", ); } } // protected get messageCount(): number { // return this._globalLog.messages.length; // } /** * ajoute un message au journal */ public addMessage(m: Message) { this._globalLog.add(m); } /** * ajoute tous les messages d'un journal au journal */ public addLog(l: cLog) { this._globalLog.addLog(l); }
211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280
/** * insert un message en début de liste */ public insertMessage(m: Message) { this._globalLog.insert(m); } /** * Teste si tous les résultats + complémentaires sont valides et journal sans erreur * @returns true si le test est valide */ public get ok(): boolean { return this.resultsOk && !this.hasErrorMessages; } /** * Teste si tous les résultats + complémentaires sont valides * @returns true si le test est valide */ public get resultsOk(): boolean { if (this._resultElements.length === 0) { return false; } for (const r of this._resultElements) { if (!r.resultsOk) { return false; } } return true; } /** * @returns true si au moins un message de log comporte un code d'erreur */ public get hasErrorMessages(): boolean { // Test du journal global for (const m of this._globalLog.messages) { if (m.getSeverity() === MessageSeverity.ERROR) { return true; } } // Test des journaux des résultats for (const r of this._resultElements) { if (r.hasErrorMessages) { return true; } } return false; } // interface NamedIterableValues public get name(): string { return this._name; } public get valuesIterator(): NumberIterator { const tmp: number[] = []; for (const re of this._resultElements) tmp.push(re.vCalc); return tmp[Symbol.iterator]() as NumberIterator; } public get hasMultipleValues(): boolean { return this._resultElements.length > 1; } // interface NamedIterableValues pour les résultats complémentaires
281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333
public getIterableExtraResults(name: string): NamedIterableValues { const res = new ExtraResults(name); let found = false; for (const r of this._resultElements) { const er = r.getExtraResult(name); if (er !== undefined) { found = true; res.addValue(er); } } if (found) return res; return undefined; } } /** * série de valeurs de résultat complémentaire */ export class ExtraResults extends JalhydObject implements NamedIterableValues { private _name: string; private _values: number[]; constructor(n: string) { super(); this._name = n; this._values = []; } public addValue(v: number) { this._values.push(v); } // interface NamedIterableValues public get valuesIterator(): NumberIterator { return this._values[Symbol.iterator]() as NumberIterator; } public get hasMultipleValues(): boolean { return this._values.length > 1; } public get name(): string { return this._name; } }