use pq\Gateway\Row;
use pq\Gateway\Rowset;
use pq\Gateway\Table;
+use pq\Gateway\Table\Reference;
use pq\Query\Expr;
class Map implements MapInterface
{
+ /**
+ * @var string
+ */
private $class;
+
+ /**
+ * @var Table
+ */
private $gateway;
+
+ /**
+ * @var ObjectManager
+ */
private $objects;
- private $properties;
+ /**
+ * @var PropertyInterface[]
+ */
+ private $properties = [];
+
+ /**
+ * Create a new object map definition
+ * @param string $class
+ * @param Table $gateway
+ * @param ...PropertyInterface $properties
+ */
function __construct($class, Table $gateway, PropertyInterface ...$properties) {
$this->class = $class;
$this->gateway = $gateway;
- $this->properties = $properties;
foreach ($properties as $property) {
- $property->setContainer($this);
+ $this->addProperty($property);
}
- $this->objects = new ObjectCache($this);
+ $this->objects = new ObjectManager($this);
}
+ /**
+ * Get the name of the mapped class
+ * @return string
+ */
function getClass() {
return $this->class;
}
+ /**
+ * Get the object manager
+ * @return ObjectManager
+ */
function getObjects() {
return $this->objects;
}
/**
+ * Get the underlying table gateway
* @return Table
*/
function getGateway() {
return $this->gateway;
}
+ /**
+ * Get the defined properties to map
+ * @return PropertyInterface[]
+ */
function getProperties() {
return $this->properties;
}
+ /**
+ * Add a property to map
+ * @param PropertyInterface $property
+ * @return Map
+ */
function addProperty(PropertyInterface $property) {
$property->setContainer($this);
$this->properties[] = $property;
return $this;
}
-/*
- function idOf(Row $row, $check = false) {
- $identity = $row->getIdentity();
- if (is_scalar($identity)) {
- return $identity;
- }
-
- if ($check && !isset($identity)) {
- return false;
- }
-
- if (is_array($identity)) {
- if ($check && array_search(null, $identity, true)) {
- return false;
- }
- /* one level is better than no level * /
- asort($identity);
- }
- return json_encode($identity);
- }
-
- function objectOf(Row $row) {
- $id = $this->idOf($row);
-
- if (isset($this->objects["obj"][$id])) {
- $obj = $this->objects["obj"][$id];
- } else {
- $obj = new $this->class;
- $this->objects["obj"][$id] = $obj;
- $this->objects["row"][spl_object_hash($obj)] = $row;
- }
- return $obj;
- }
- function rowOf($object) {
- $id = spl_object_hash($object);
-
- if (isset($this->objects["row"][$id])) {
- $row = $this->objects["row"][$id];
- } else {
- $row = new Row($this->gateway);
- $this->objects["row"][$id] = $row;
- }
- return $row;
- }
-*/
+ /**
+ * Get all child rows by foreign key
+ * @param Row $row
+ * @param string $refName
+ * @param array $objects
+ * @return Rowset
+ */
function allOf(Row $row, $refName, &$objects = null) {
/* apply objectOf to populate the object cache */
return $this->gateway->of($row, $refName)->apply(function($row) use(&$objects) {
});
}
+ /**
+ * Get the parent row by foreign key
+ * @param Row $row
+ * @param string $refName
+ * @param array $objects
+ * @return Rowset
+ */
function refOf(Row $row, $refName, &$objects = null) {
$rid = [];
$rel = $row->getTable()->getRelation($this->gateway->getName(), $refName);
});
}
+ /**
+ * Get the table relation reference
+ * @param MapInterface $map
+ * @param string $refName
+ * @return Reference
+ */
function relOf(MapInterface $map, $refName) {
return $map->getGateway()->getRelation(
$this->gateway->getName(), $refName);
}
+ /**
+ * Drain the deferred callback queue
+ * @param callable[] $deferred
+ * @param callable $exec
+ */
private function drain(array $deferred, callable $exec) {
while ($deferred) {
$cb = array_shift($deferred);
}
}
+ /**
+ * Map a row to an object
+ * @param Row $row
+ * @return object
+ */
function map(Row $row) {
$deferred = [];
$object = $this->objects->asObject($row);
return $object;
}
+ /**
+ * Map a rowset to an array of objects
+ * @param Rowset $rows
+ * @return object[]
+ */
function mapAll(Rowset $rows) {
$objects = [];
foreach ($rows as $row) {
return $objects;
}
+ /**
+ * Unmap on object
+ * @param object $object
+ */
function unmap($object) {
$deferred = [];
/* @var $row Row */
$row->update();
}
}
-
-}
\ No newline at end of file
+}