-
Dorchies David authored8038b402
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;
}
}