summaryrefslogtreecommitdiffstats
path: root/src/datasets
diff options
context:
space:
mode:
authorKore Nordmann <github@kore-nordmann.de>2006-12-20 14:16:56 +0000
committerKore Nordmann <github@kore-nordmann.de>2006-12-20 14:16:56 +0000
commit3d159bca6c8d9f22203edabd416d30004dca02c5 (patch)
tree46ab1ad62a00cee769ba2f9c1e4166172a5ccd17 /src/datasets
parent1e1dca545ad348cc7ce1be7257fcd2d7e7a4270d (diff)
downloadzetacomponents-graph-3d159bca6c8d9f22203edabd416d30004dca02c5.zip
zetacomponents-graph-3d159bca6c8d9f22203edabd416d30004dca02c5.tar.gz
- Implemented feature #9402: (Numeric datasets)
Diffstat (limited to 'src/datasets')
-rw-r--r--src/datasets/average.php7
-rw-r--r--src/datasets/numeric.php286
2 files changed, 288 insertions, 5 deletions
diff --git a/src/datasets/average.php b/src/datasets/average.php
index 96e790a..1f0773c 100644
--- a/src/datasets/average.php
+++ b/src/datasets/average.php
@@ -133,14 +133,11 @@ class ezcGraphDataSetAveragePolynom extends ezcGraphDataSet
*/
public function __get( $propertyName )
{
- if ( isset( $this->properties[$propertyName] ) )
+ if ( array_key_exists( $propertyName, $this->properties ) )
{
return $this->properties[$propertyName];
}
- else
- {
- return parent::__get( $propertyName );
- }
+ return parent::__get( $propertyName );
}
/**
diff --git a/src/datasets/numeric.php b/src/datasets/numeric.php
new file mode 100644
index 0000000..e33b1bc
--- /dev/null
+++ b/src/datasets/numeric.php
@@ -0,0 +1,286 @@
+<?php
+/**
+ * File containing the ezcGraphNumericDataSet class
+ *
+ * @package Graph
+ * @version //autogentag//
+ * @copyright Copyright (C) 2005, 2006 eZ systems as. All rights reserved.
+ * @license http://ez.no/licenses/new_bsd New BSD License
+ */
+/**
+ * Dataset for numeric data.
+ *
+ * Uses user defined functions for numeric data creation
+ *
+ * @property float $start
+ * Start value for x axis values of function
+ * @property float $end
+ * End value for x axis values of function
+ * @property callback $callback
+ * Callback function which represents the mathmatical function to
+ * show
+ * @property int $resolution
+ * Steps used to draw line in graph
+ *
+ * @package Graph
+ * @mainclass
+ */
+class ezcGraphNumericDataSet extends ezcGraphDataSet
+{
+ /**
+ * Position of the data iterator. Depends on the configured resolution.
+ *
+ * @var int
+ */
+ protected $position = 0;
+
+ /**
+ * Container to hold the properties
+ *
+ * @var array(string=>mixed)
+ */
+ protected $properties;
+
+ /**
+ * Constructor
+ *
+ * @param float $start Start value for x axis values of function
+ * @param float $end End value for x axis values of function
+ * @param callback $callback Callback function
+ * @return void
+ * @ignore
+ */
+ public function __construct( $start = null, $end = null, $callback = null )
+ {
+ parent::__construct();
+
+ $this->properties['start'] = null;
+ $this->properties['end'] = null;
+ $this->properties['callback'] = null;
+
+ if ( $start !== null )
+ {
+ $this->start = $start;
+ }
+
+ if ( $end !== null )
+ {
+ $this->end = $end;
+ }
+
+ if ( $callback !== null )
+ {
+ $this->callback = $callback;
+ }
+
+ $this->properties['resolution'] = 100;
+ }
+
+ /**
+ * Options write access
+ *
+ * @throws ezcBasePropertyNotFoundException
+ * If Option could not be found
+ * @throws ezcBaseValueException
+ * If value is out of range
+ * @param mixed $propertyName Option name
+ * @param mixed $propertyValue Option value;
+ * @return mixed
+ */
+ public function __set( $propertyName, $propertyValue )
+ {
+ switch ( $propertyName ) {
+ case 'resolution':
+ if ( !is_numeric( $propertyValue ) ||
+ ( $propertyValue < 1 ) )
+ {
+ throw new ezcBaseValueException( $propertyName, $propertyValue, 'int > 1' );
+ }
+
+ $this->properties['resolution'] = (int) $propertyValue;
+ break;
+ case 'start':
+ case 'end':
+ if ( !is_numeric( $propertyValue ) )
+ {
+ throw new ezcBaseValueException( $propertyName, $propertyValue, 'float' );
+ }
+
+ $this->properties[$propertyName] = (float) $propertyValue;
+ break;
+ case 'callback':
+ if ( !is_callable( $propertyValue ) )
+ {
+ throw new ezcBaseValueException( $propertyName, $propertyValue, 'callback' );
+ }
+
+ $this->properties[$propertyName] = $propertyValue;
+ break;
+ default:
+ parent::__set( $propertyName, $propertyValue );
+ break;
+ }
+ }
+
+ /**
+ * Property get access.
+ * Simply returns a given option.
+ *
+ * @param string $propertyName The name of the option to get.
+ * @return mixed The option value.
+ *
+ * @throws ezcBasePropertyNotFoundException
+ * If a the value for the property options is not an instance of
+ */
+ public function __get( $propertyName )
+ {
+ if ( array_key_exists( $propertyName, $this->properties ) )
+ {
+ return $this->properties[$propertyName];
+ }
+ return parent::__get( $propertyName );
+ }
+
+ /**
+ * Get the x coordinate for the current position
+ *
+ * @param int $position Position
+ * @return float x coordinate
+ */
+ protected function getKey()
+ {
+ return $this->start +
+ ( $this->end - $this->start ) / $this->resolution * $this->position;
+ }
+
+ /**
+ * Returns true if the given datapoint exists
+ * Allows isset() using ArrayAccess.
+ *
+ * @param string $key The key of the datapoint to get.
+ * @return bool Wether the key exists.
+ */
+ public function offsetExists( $key )
+ {
+ return ( ( $key >= $this->start ) && ( $key <= $this->end ) );
+ }
+
+ /**
+ * Returns the value for the given datapoint
+ * Get an datapoint value by ArrayAccess.
+ *
+ * @param string $key The key of the datapoint to get.
+ * @return float The datapoint value.
+ */
+ public function offsetGet( $key )
+ {
+ return call_user_func( $this->callback, $key );
+ }
+
+ /**
+ * Throws a ezcBasePropertyPermissionException because single datapoints
+ * cannot be set in average datasets.
+ *
+ * @param string $key The kex of a datapoint to set.
+ * @param float $value The value for the datapoint.
+ * @throws ezcBasePropertyPermissionException
+ * Always, because access is readonly.
+ * @return void
+ */
+ public function offsetSet( $key, $value )
+ {
+ throw new ezcBasePropertyPermissionException( $key, ezcBasePropertyPermissionException::READ );
+ }
+
+ /**
+ * Returns the currently selected datapoint.
+ *
+ * This method is part of the Iterator interface to allow access to the
+ * datapoints of this row by iterating over it like an array (e.g. using
+ * foreach).
+ *
+ * @return string The currently selected datapoint.
+ */
+ final public function current()
+ {
+ return call_user_func( $this->callback, $this->getKey() );
+ }
+
+ /**
+ * Returns the next datapoint and selects it or false on the last datapoint.
+ *
+ * This method is part of the Iterator interface to allow access to the
+ * datapoints of this row by iterating over it like an array (e.g. using
+ * foreach).
+ *
+ * @return float datapoint if it exists, or false.
+ */
+ final public function next()
+ {
+ if ( $this->start === $this->end )
+ {
+ throw new ezcGraphDatasetAverageInvalidKeysException();
+ }
+
+ if ( ++$this->position >= $this->resolution )
+ {
+ return false;
+ }
+ else
+ {
+ return $this->current();
+ }
+ }
+
+ /**
+ * Returns the key of the currently selected datapoint.
+ *
+ * This method is part of the Iterator interface to allow access to the
+ * datapoints of this row by iterating over it like an array (e.g. using
+ * foreach).
+ *
+ * @return string The key of the currently selected datapoint.
+ */
+ final public function key()
+ {
+ return (string) $this->getKey();
+ }
+
+ /**
+ * Returns if the current datapoint is valid.
+ *
+ * This method is part of the Iterator interface to allow access to the
+ * datapoints of this row by iterating over it like an array (e.g. using
+ * foreach).
+ *
+ * @return bool If the current datapoint is valid
+ */
+ final public function valid()
+ {
+ return ( ( $this->getKey() >= $this->start ) && ( $this->getKey() <= $this->end ) );
+ }
+
+ /**
+ * Selects the very first datapoint and returns it.
+ * This method is part of the Iterator interface to allow access to the
+ * datapoints of this row by iterating over it like an array (e.g. using
+ * foreach).
+ *
+ * @return float The very first datapoint.
+ */
+ final public function rewind()
+ {
+ $this->position = 0;
+ }
+
+ /**
+ * Returns the number of elements in this dataset
+ *
+ * @return int
+ */
+ public function count()
+ {
+ return $this->resolution + 1;
+ }
+}
+?>
OpenPOWER on IntegriCloud