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
|
<?php
namespace Wikimedia\WRStats;
/**
* Class representation of normalized metric specifications
*
* @internal
*/
class MetricSpec {
/** The default (value axis) resolution */
public const DEFAULT_RESOLUTION = 1;
/** @var string */
public $type;
/** @var float|int */
public $resolution;
/** @var array<string,SequenceSpec> Sequences in ascending order of expiry */
public $sequences;
/**
* @param array $spec
*/
public function __construct( array $spec ) {
$this->type = $spec['type'] ?? 'counter';
$this->resolution = $spec['resolution'] ?? self::DEFAULT_RESOLUTION;
foreach ( [ 'timeStep', 'expiry' ] as $var ) {
if ( isset( $spec[$var] ) ) {
throw new WRStatsError( "$var must be in the sequences array" );
}
}
$seqArrays = $spec['sequences'] ?? [];
if ( !$seqArrays ) {
$seqArrays = [ [] ];
}
$sequences = [];
foreach ( $seqArrays as $i => $seqArray ) {
if ( !is_array( $seqArray ) ) {
throw new WRStatsError( 'sequences must be an array of arrays' );
}
$seqSpec = new SequenceSpec( $seqArray );
while ( isset( $sequences[$seqSpec->name] ) ) {
$seqSpec->name .= "s$i";
}
$sequences[$seqSpec->name] = $seqSpec;
}
uasort( $sequences, static function ( SequenceSpec $a, SequenceSpec $b ) {
return $a->hardExpiry <=> $b->hardExpiry;
} );
$this->sequences = $sequences;
}
}
|