<?php
namespace ProjectBiz\DatabaseBundle\Database;
/**
* The GenericRepositoryOptions class is responsible for the auto-configuration of
* a GenericRepository. It checks which special tables are present in a table
* and builds the corresponding configuration.
*/
class GenericRepositoryOptions
{
// Magic columns
const cCreatedAtColumnName = '_initialized_Date';
const cCreatedByColumnName = '_initialized_LINK_User_ID';
const cModifiedAtColumnName = '_Last_Change';
const cModifiedByColumnName = '_Last_LINK_User_ID';
const cVersionColumnName = '_VersionID';
const cReleaseColumnName = '_[a-zA-Z]+_ReleaseID$';
const cReleaseColumnLinkName = '\w+LINK_\w+_ReleaseID$';
const cAncestorColumnName = '_LINK_Ancestor_ID';
const cLogColumnName = '_Log';
const cQInfoColumnName = '_QInfo';
const cDeletedColumnName = '_Deleted';
const cArchivedColumnName = '_Archived';
const cLockedAtColumnName = '_Lock_Date';
const cLockedByColumnName = '_Lock_LINK_User_ID';
const cPasswordColumnName = '_Password';
const cManSortColumnName = '_manSort';
const cChooseProjectlist = '_LINK_ChooseProjectlist_ID';
const cPermissions = '_Permissions';
const cReadRecordRights = '_Read_Record_Rights';
const cWriteRecordRights = '_Write_Record_Rights';
const cOwner = '_Owner_Link_User_ID';
// Feature Flags
protected $tableHelper;
protected $options;
private $useModificationTimestamp = false;
private $useCreationTimestamp = false;
private $useVersioning = false;
private $useRelease = false;
private $useReleaseLink = false;
private $useLog = false;
private $useDeleted = false;
private $useArchived = false;
private $useQInfo = false;
private $useLocking = false;
private $usePassword = false;
private $useManSort = false;
private $useChooseProjectlist = false;
private $usePermissions = false;
private $useReadRecordRights = false;
private $useWriteRecordRights = false;
private $useOwner = false;
private $systemColumns = [];
private $autoColumns = []; // Automatically computed columns, Ignored when comparing objects for equality
public function __construct(TableInfoInterface $tableInfo, array $options = [])
{
$this->tableInfo = $tableInfo;
$this->options = $this->buildOptions($options);
if (isset($this->options['system_columns'])) {
$this->systemColumns = array_unique(array_merge($this->systemColumns, $this->options['system_columns']));
}
$this->systemColumns[] = $this->options['primary_key'];
// All auto-columns are system-columns
$this->systemColumns = array_unique(array_merge($this->systemColumns, $this->autoColumns));
}
// Query used features
protected function buildOptions($options)
{
$columns = $this->tableInfo->getColumns();
$tablename = $this->tableInfo->getTablename();
$requiredColumns = isset($options['required_columns'])?$options['required_columns']:[];
if (!isset($options['primary_key'])) {
$options['primary_key'] = $this->tableInfo->getPrimaryKey();
}
if (!isset($options['preventAutoModificationTimestamp'])) {
if (!isset($options['modified_at'])) {
if (in_array($tablename . self::cModifiedAtColumnName, $columns)) {
$options['modified_at'] = $tablename . self::cModifiedAtColumnName;
}
}
if (!isset($options['modified_by'])) {
if (in_array($tablename . self::cModifiedByColumnName, $columns)) {
$options['modified_by'] = $tablename . self::cModifiedByColumnName;
}
}
if (isset($options['modified_at']) && isset($options['modified_by'])) {
$this->useModificationTimestamp = true;
//$this->columnsWriteMasked[] = $options['modified_at'];
//$this->columnsWriteMasked[] = $options['modified_by'];
$this->autoColumns[] = $options['modified_at'];
$this->autoColumns[] = $options['modified_by'];
}
}
if (!isset($options['preventAutoCreationTimestamp'])) {
if (!isset($options['created_at'])) {
if (in_array($tablename . self::cCreatedAtColumnName, $columns)) {
$options['created_at'] = $tablename . self::cCreatedAtColumnName;
}
}
if (!isset($options['created_by'])) {
if (in_array($tablename . self::cCreatedByColumnName, $columns)) {
$options['created_by'] = $tablename . self::cCreatedByColumnName;
}
}
if (isset($options['created_at']) && isset($options['created_by'])) {
$this->useCreationTimestamp = true;
//$this->columnsWriteMasked[] = $options['created_at'];
//$this->columnsWriteMasked[] = $options['created_by'];
$this->autoColumns[] = $options['created_at'];
$this->autoColumns[] = $options['created_by'];
}
}
if (!isset($options['preventAutoVersioning'])) {
if (!isset($options['version'])) {
if (in_array($tablename . self::cVersionColumnName, $columns)) {
$options['version'] = $tablename . self::cVersionColumnName;
}
}
if (!isset($options['ancestor'])) {
if (in_array($tablename . self::cAncestorColumnName, $columns)) {
$options['ancestor'] = $tablename . self::cAncestorColumnName;
}
}
if (!isset($options['release'])) {
/*
* Get the name of the column with pattern *_ReleaseID
*/
$options['release'] = preg_grep('/' . $tablename . self::cReleaseColumnName . '/', $columns);
}
if (!isset($options['releaseLink'])) {
/*
* Get the name of the column with pattern *_LINK_*_ReleaseID
*/
{
$releaseLinks = preg_grep('/' . self::cReleaseColumnLinkName . '/', $columns);
if(count($releaseLinks) > 0) {
$options['releaseLink'] = current($releaseLinks);
}
}
}
if (isset($options['version']) && isset($options['ancestor'])) {
$this->useVersioning = false;
if ($tablename<>'vDocumentFile') {
$this->useVersioning = true;
$this->autoColumns[] = $options['version'];
$this->autoColumns[] = $options['ancestor'];
}
//var Test
//$this->columnsWriteMasked[] = $options['version'];
//$this->columnsWriteMasked[] = $options['ancestor'];
}
if (isset($options['release']) && count($options['release']) > 0) {
$this->useRelease = true;
foreach ($options['release'] as $releaseColumn) {
$this->autoColumns[] = $releaseColumn;
}
}
if (isset($options['releaseLink'])) {
$this->useReleaseLink = true;
$this->autoColumns[] = $options['releaseLink'];
}
}
if (!isset($options['preventAutoLog'])) {
if (!isset($options['log'])) {
if (in_array($tablename . self::cLogColumnName, $columns)) {
$options['log'] = [$tablename . self::cLogColumnName];
}
}
if (isset($options['log'])) {
$this->useLog = true;
}
}
if (!isset($options['preventAutoPassword'])) {
if (!isset($options['password'])) {
if (in_array($tablename . self::cPasswordColumnName, $columns)) {
$options['password'] = [$tablename . self::cPasswordColumnName];
}
}
if (isset($options['password'])) {
$this->usePassword = true;
}
}
if (!isset($options['preventAutoDeleted'])) {
if (!isset($options['deleted'])) {
if (in_array($tablename . self::cDeletedColumnName, $columns)) {
$options['deleted'] = $tablename . self::cDeletedColumnName;
}
}
if (isset($options['deleted'])) {
$this->useDeleted = true;
//$this->columnsWriteMasked[] = $options['deleted'];
$this->systemColumns[] = $options['deleted'];
}
}
if (!isset($options['preventAutoArchive'])) {
if (!isset($options['archived'])) {
if (in_array($tablename . self::cArchivedColumnName, $columns)) {
$options['archived'] = $tablename . self::cArchivedColumnName;
}
}
if (isset($options['archived'])) {
$this->useArchived = true;
//$this->columnsWriteMasked[] = $options['deleted'];
$this->systemColumns[] = $options['archived'];
}
}
if (!isset($options['preventAutoQInfo'])) {
if (!isset($options['qinfo'])) {
if (in_array($tablename . self::cQInfoColumnName, $columns)) {
$options['qinfo'] = $tablename . self::cQInfoColumnName;
}
}
if (isset($options['qinfo'])) {
$this->useQInfo = true;
}
}
if (!isset($options['preventAutoLocking'])) {
if (!isset($options['locked_at'])) {
if (in_array($tablename . self::cLockedAtColumnName, $columns)) {
$options['locked_at'] = $tablename . self::cLockedAtColumnName;
}
}
if (!isset($options['locked_by'])) {
if (in_array($tablename . self::cLockedByColumnName, $columns)) {
$options['locked_by'] = $tablename . self::cLockedByColumnName;
}
}
if (isset($options['locked_at']) && isset($options['locked_by'])) {
$this->useLocking = true;
//$this->columnsWriteMasked[] = $options['locked_at'];
//$this->columnsWriteMasked[] = $options['locked_by'];
$this->systemColumns[] = $options['locked_at'];
$this->systemColumns[] = $options['locked_by'];
}
}
if (!isset($options['preventManSort'])) {
if (!isset($options['man_sort'])) {
if (in_array($tablename . self::cManSortColumnName, $columns)) {
$options['man_sort'] = $tablename . self::cManSortColumnName;
}
}
if (!isset($options['man_sort_set'])) {
$options['man_sort_set'] = [];
}
if (isset($options['man_sort'])) {
$this->useManSort = true;
$requiredColumns[] = $options['man_sort'];
}
}
if (!isset($options['preventChooseProjectlist'])) {
if (!isset($options['choose_projectlist'])) {
if (in_array($tablename . self::cChooseProjectlist, $columns)) {
$options['choose_projectlist'] = $tablename . self::cChooseProjectlist;
}
}
if (isset($options['choose_projectlist'])) {
$this->useChooseProjectlist = true;
}
}
if (!isset($options['preventPermissions'])) {
if (!isset($options['permissions'])) {
if (in_array($tablename . self::cPermissions, $columns)) {
$options['permissions'] = $tablename . self::cPermissions;
}
}
if (isset($options['permissions'])) {
$this->usePermissions = true;
}
}
if (!isset($options['preventReadRecordRights'])) {
if (!isset($options['read_record_rights'])) {
if (in_array($tablename . self::cReadRecordRights, $columns)) {
$options['read_record_rights'] = $tablename . self::cReadRecordRights;
}
}
if (isset($options['read_record_rights'])) {
$this->useReadRecordRights = true;
// $this->systemColumns[] = $options['read_record_rights'];
}
}
if (!isset($options['preventWriteRecordRights'])) {
if (!isset($options['write_record_rights'])) {
if (in_array($tablename . self::cWriteRecordRights, $columns)) {
$options['write_record_rights'] = $tablename . self::cWriteRecordRights;
}
}
if (isset($options['write_record_rights'])) {
$this->useWriteRecordRights = true;
// $this->systemColumns[] = $options['write_record_rights'];
}
}
if (!isset($options['preventOwner'])) {
if (!isset($options['owner'])) {
if (in_array($tablename . self::cOwner, $columns)) {
$options['owner'] = $tablename . self::cOwner;
}
}
if (isset($options['owner'])) {
$this->useOwner = true;
}
}
if (count($requiredColumns) > 0) {
$options['required_columns'] = $requiredColumns;
}
return $options;
}
public function useModificationTimestamp()
{
return $this->useModificationTimestamp;
}
public function useCreationTimestamp()
{
return $this->useCreationTimestamp;
}
public function useVersioning()
{
return $this->useVersioning;
}
public function useRelease()
{
return $this->useRelease;
}
public function useReleaseLink()
{
return $this->useReleaseLink;
}
public function useLog()
{
return $this->useLog;
}
public function useDeleted()
{
return $this->useDeleted;
}
public function useArchived()
{
return $this->useArchived;
}
public function useQInfo()
{
return $this->useQInfo;
}
public function useLocking()
{
return $this->useLocking;
}
public function usePassword()
{
return $this->usePassword;
}
public function useManSort()
{
return $this->useManSort;
}
public function useChooseProjectList()
{
return $this->useChooseProjectlist;
}
public function usePermissions()
{
return $this->usePermissions;
}
public function useReadRecordRights()
{
return $this->useReadRecordRights;
}
public function useWriteRecordRights()
{
return $this->useWriteRecordRights;
}
public function useOwner()
{
return $this->useOwner;
}
public function getVersionColumn()
{
return $this->options['version'];
}
public function getAncestorColumn()
{
return $this->options['ancestor'];
}
public function getReleaseColumns()
{
return $this->options['release'];
}
public function getReleaseLinkColumn()
{
return $this->options['releaseLink'];
}
public function getModifiedAtColumn()
{
return $this->options['modified_at'];
}
public function getModifiedByColumn()
{
return $this->options['modified_by'];
}
public function getCreatedAtColumn()
{
return $this->options['created_at'];
}
public function getCreatedByColumn()
{
return $this->options['created_by'];
}
public function getDeletedColumn()
{
return $this->options['deleted'];
}
public function getArchivedColumn()
{
return $this->options['archived'];
}
public function getQInfoColumn()
{
return $this->options['qinfo'];
}
public function getLockedByColumn()
{
return $this->options['locked_by'];
}
public function getLockedAtColumn()
{
return $this->options['locked_at'];
}
public function getManSortColumn()
{
return $this->options['man_sort'];
}
public function getManSortSetColumns()
{
return $this->options['man_sort_set'];
}
public function getChooseProjectlistColumn()
{
return $this->options['choose_projectlist'];
}
public function getPermissionsColumn()
{
return $this->options['permissions'];
}
public function getReadRecordRightsColumn()
{
return $this->options['read_record_rights'];
}
public function getWriteRecordRightsColumn()
{
return $this->options['write_record_rights'];
}
public function getOwnerColumn()
{
return $this->options['owner'];
}
public function hasLogHeader($index)
{
return isset($this->options['log-headers']) && (count($this->options['log-headers']) > $index);
}
/**
* @param $index
*
* @return \ProjectBiz\PortalBundle\Service\LogHeaderInterface
*/
public function getLogHeader($index)
{
return $this->options['log-headers'][$index];
}
public function isLogColumn($column)
{
return in_array($column, $this->getLogColumns());
}
public function getLogColumns()
{
return $this->options['log'];
}
public function isPasswordColumn($column)
{
return in_array($column, $this->getPasswordColumns());
}
public function getPasswordColumns()
{
return $this->options['password'];
}
public function getOption($name)
{
return isset($this->options[$name])?$this->options[$name]:null;
}
public function getSystemColumns()
{
return $this->systemColumns;
}
public function getAutoColumns()
{
return $this->autoColumns;
}
public function isSystemColumn($column)
{
return in_array($column, $this->systemColumns);
}
public function isAutoColumn($column)
{
return in_array($column, $this->autoColumns);
}
}