<?php
namespace ProjectBiz\DatabaseBundle\Database;
use Doctrine\DBAL\Query\QueryBuilder;
use Symfony\Contracts\Translation\TranslatorInterface;
class TableInfo extends TableAndViewInfo
{
private $descriptor;
private $cachedPrimaryKey;
private $cachedColumns;
private $cachedColumnDefinitions;
private $cachedColumnSelectionForView;
public function __construct(
TableDescriptor $descriptor,
DatabaseSchemaCache $databaseSchemaCache,
TableHelper $tableHelper,
TranslatorInterface $translator
) {
$this->descriptor = $descriptor;
parent::__construct(
$descriptor->getMainTablename(),
$databaseSchemaCache,
$tableHelper,
$translator
);
$this->cachedColumnDefinitions = [];
}
/**
* @inheritdoc
*/
public function getPrimaryKey()
{
return $this->databaseSchemaCache->getPrimaryKey($this->getTablename());
}
/**
* @inheritdoc
*/
public function getColumns()
{
if (!isset($this->cachedColumns)) {
// Get definied columns and map them to their view-names
$columns = [];
/** @var \ProjectBiz\DatabaseBundle\Entity\ColumnDefinition $columnDefinition */
foreach ($this->getColumnDefinitions() as $columnDefinition) {
if ($columnDefinition->getTable() == $this->descriptor->getMainTablename()) {
$columns[] = $columnDefinition->getColumn();
}
foreach ($this->descriptor->getJoins() as $join) {
if ($columnDefinition->getTable() == $join['joinTable']) {
$columns[] = strtoupper($join['joinTableAlias']) . '__' . $columnDefinition->getColumn();
}
}
}
$this->cachedColumns = $columns;
}
return $this->cachedColumns;
}
/**
* @inheritdoc
*/
public function getColumnDefinitions()
{
// var_dump(55555555555555);
if (!is_a($this->descriptor, 'ProjectBiz\DatabaseBundle\Database\TableDescriptor')) {
return $this->databaseSchemaCache->getColumnDefinitionsByTable($this->getTablename());
}
else {
if (!array_key_exists($this->descriptor->getUniqueName(), $this->cachedColumnDefinitions)) {
$this->cachedColumnDefinitions[$this->descriptor->getUniqueName()] = [];
//var_dump($this->descriptor->getTableNames());
foreach ($this->descriptor->getTableNames() as $tablename) {
$this->cachedColumnDefinitions[$this->descriptor->getUniqueName()] = array_merge(
$this->cachedColumnDefinitions[$this->descriptor->getUniqueName()],
$this->databaseSchemaCache->getColumnDefinitionsByTable($tablename)
);
}
}
return $this->cachedColumnDefinitions[$this->descriptor->getUniqueName()];
}
}
/*
* Get the columns that are writeable with the given rights
* @param $rights
* @return \ProjectBiz\DatabaseBundle\Database\Column[]
*
public function getWriteableColumns($rights) {
if (!isset($this->writeableColumns[$rights])) {
$columns = $this->getValidColumns();
$this->writeableColumns[$rights] = new ColumnList();
$editableJoins = array('mt' => true);
foreach($this->descriptor->getJoins() as $join) {
if (isset($join['editable'])) {
$editableJoins[$join['joinTableAlias']] = true;
}
}
$colDefs = $this->getColumnDefinitions();
foreach ($columns->getColumns() as $column) {
if (
isset($colDefs[$column->getDefinitionName()]) &&
$colDefs[$column->getDefinitionName()]->checkWriteRights($rights) &&
isset($editableJoins[$column->getTableAlias()])
) {
$this->writeableColumns[$rights]->addColumnObject($column);
}
}
}
return $this->writeableColumns[$rights];
}
*/
/**
* @inheritdoc
*/
public function buildFrom(QueryBuilder $builder, $mainTableName = 'mt')
{
$builder->from($this->getInternalTablename(), $mainTableName);
$this->buildJoins($builder, $mainTableName);
}
/**
* @inheritdoc
*/
public function buildJoins(QueryBuilder $builder, $mainTableName = 'mt')
{
foreach ($this->descriptor->getJoins() as $join) {
// @todo: check, if join is allowed (column rights - and maybe object rights (!?))
$fromAlias = ($join['fromAlias'] == 'mt')?$mainTableName:$join['fromAlias'];
switch ($join['type']) {
case 'join':
$builder->join(
$fromAlias,
$this->databaseSchemaCache->getPrefix() . $join['joinTable'],
$join['joinTableAlias'],
$join['condition']
);
break;
case 'innerJoin':
$builder->innerJoin(
$fromAlias,
$this->databaseSchemaCache->getPrefix() . $join['joinTable'],
$join['joinTableAlias'],
$join['condition']
);
break;
case 'leftJoin':
$builder->leftJoin(
$fromAlias,
$this->databaseSchemaCache->getPrefix() . $join['joinTable'],
$join['joinTableAlias'],
$join['condition']
);
break;
case 'rightJoin':
$builder->rightJoin(
$fromAlias,
$this->databaseSchemaCache->getPrefix() . $join['joinTable'],
$join['joinTableAlias'],
$join['condition']
);
break;
}
}
}
public function getColumnSelectionForView()
{
/**
* @inheritdoc
*/
if (!isset($this->cachedColumnSelectionForView)) {
// Get definied columns and map them to their view-names
$columns = [];
/** @var \ProjectBiz\DatabaseBundle\Entity\ColumnDefinition $columnDefinition */
foreach ($this->getColumnDefinitions() as $columnDefinition) {
if ($columnDefinition->getTable() == $this->descriptor->getMainTablename()) {
$columnName = $columnDefinition->getColumn();
/*
* Hide the column and all referenced columns in view-editor when the user rights are not sufficient.
*/
if (!$columnDefinition->checkReadRights($this->userRights)) {
continue;
}
$columns[] = $columnName;
$columns = $this->addReferencedColumns($columns, $columnName, $columnDefinition);
}
foreach ($this->descriptor->getJoins() as $join) {
if ($columnDefinition->getTable() == $join['joinTable']) {
$columnName = strtoupper($join['joinTableAlias']) . '__' . $columnDefinition->getColumn();
$columns[] = $columnName;
$columns = $this->addReferencedColumns($columns, $columnName, $columnDefinition);
}
}
}
$this->cachedColumnSelectionForView = $columns;
}
return $this->cachedColumnSelectionForView;
}
public function getInternalTablename() {
return $this->databaseSchemaCache->getPrefix() . $this->getTablename();
}
/**
* Get the columnnames stored in »TableDefinition_MainDescriptionColumns«.
*
* @param bool $strict Throw an exception if »TableDefinition_MainDescriptionColumns« is empty.
* @return array|null
* @throws \Exception
*/
public function getMainDescriptionColumns(bool $strict = true)
{
$tableDefinitions = $this->databaseSchemaCache->getTableDefinitions();
if (!$tableDefinitions[$this->tablename]['TableDefinition_MainDescriptionColumns']) {
if ($strict) {
throw new \Exception("»TableDefinition_MainDescriptionColumns« must not be empty.");
} else {
return null;
}
}
$mainDescriptionColumns = json_decode($tableDefinitions[$this->tablename]['TableDefinition_MainDescriptionColumns']);
if (!$mainDescriptionColumns) {
throw new \Exception('Wrong json in »TableDefinition_MainDescriptionColumns«: ' . $tableDefinitions[$this->tablename]['TableDefinition_MainDescriptionColumns']);
}
return $mainDescriptionColumns;
}
/**
* Retrieve the values of a record as array which match the main description columns.
*
* @param array $data The data of the record.
* @param bool $strict Will throw an exception if »TableDefinition_MainDescriptionColumns« is empty.
* @return array|null
*/
public function getMainDescription($data, bool $strict = true)
{
$mainDescriptionColumns = $this->getMainDescriptionColumns($strict);
if ($mainDescriptionColumns === null) {
return null;
}
$mainDescription = [];
foreach ($mainDescriptionColumns as $descriptionColumn) {
if ($data[$descriptionColumn]) {
$mainDescription[] = $data[$descriptionColumn];
}
}
return $mainDescription;
}
}