mirror of
https://git.code.sf.net/p/seeddms/code
synced 2024-10-16 21:12:29 +00:00
minimize number of sql statements
add new method getInstanceByData(), get folders and documents from first sql statement which fetches the subfolders and documents of a folder instead of fetching each single document and folder.
This commit is contained in:
parent
f453cac8d2
commit
61f1ddbd08
|
@ -265,6 +265,22 @@ class SeedDMS_Core_Document extends SeedDMS_Core_Object { /* {{{ */
|
|||
return $searchFields;
|
||||
} /* }}} */
|
||||
|
||||
/**
|
||||
* Return a folder by its database record
|
||||
*
|
||||
* @param array $resArr array of folder data as returned by database
|
||||
* @param SeedDMS_Core_DMS $dms
|
||||
* @return SeedDMS_Core_Folder|bool instance of SeedDMS_Core_Folder if document exists
|
||||
*/
|
||||
public static function getInstanceByData($resArr, $dms) { /* {{{ */
|
||||
$classname = $dms->getClassname('document');
|
||||
/** @var SeedDMS_Core_Document $document */
|
||||
$document = new $classname($resArr["id"], $resArr["name"], $resArr["comment"], $resArr["date"], $resArr["expires"], $resArr["owner"], $resArr["folder"], $resArr["inheritAccess"], $resArr["defaultAccess"], $resArr['lock'], $resArr["keywords"], $resArr["sequence"]);
|
||||
$document->setDMS($dms);
|
||||
$document = $document->applyDecorators();
|
||||
return $document;
|
||||
} /* }}} */
|
||||
|
||||
/**
|
||||
* Return an document by its id
|
||||
*
|
||||
|
@ -276,7 +292,8 @@ class SeedDMS_Core_Document extends SeedDMS_Core_Object { /* {{{ */
|
|||
public static function getInstance($id, $dms) { /* {{{ */
|
||||
$db = $dms->getDB();
|
||||
|
||||
$queryStr = "SELECT * FROM `tblDocuments` WHERE `id` = " . (int) $id;
|
||||
// $queryStr = "SELECT * FROM `tblDocuments` WHERE `id` = " . (int) $id;
|
||||
$queryStr = "SELECT `tblDocuments`.*, `tblDocumentLocks`.`userID` as `lock` FROM `tblDocuments` LEFT JOIN `tblDocumentLocks` ON `tblDocuments`.`id` = `tblDocumentLocks`.`document` WHERE `id` = " . (int) $id;
|
||||
$resArr = $db->getResultArray($queryStr);
|
||||
if (is_bool($resArr) && $resArr == false)
|
||||
return false;
|
||||
|
@ -285,20 +302,26 @@ class SeedDMS_Core_Document extends SeedDMS_Core_Object { /* {{{ */
|
|||
$resArr = $resArr[0];
|
||||
|
||||
// New Locking mechanism uses a separate table to track the lock.
|
||||
/*
|
||||
$queryStr = "SELECT * FROM `tblDocumentLocks` WHERE `document` = " . (int) $id;
|
||||
$lockArr = $db->getResultArray($queryStr);
|
||||
if ((is_bool($lockArr) && $lockArr==false) || (count($lockArr)==0)) {
|
||||
// Could not find a lock on the selected document.
|
||||
$lock = -1;
|
||||
$resArr['lock'] = -1;
|
||||
}
|
||||
else {
|
||||
// A lock has been identified for this document.
|
||||
$lock = $lockArr[0]["userID"];
|
||||
$resArr['lock'] = $lockArr[0]["userID"];
|
||||
}
|
||||
*/
|
||||
$resArr['lock'] = !$resArr['lock'] ? -1 : $resArr['lock'];
|
||||
// print_r($resArr);exit;
|
||||
|
||||
return self::getInstanceByData($resArr, $dms);
|
||||
|
||||
$classname = $dms->getClassname('document');
|
||||
/** @var SeedDMS_Core_Document $document */
|
||||
$document = new $classname($resArr["id"], $resArr["name"], $resArr["comment"], $resArr["date"], $resArr["expires"], $resArr["owner"], $resArr["folder"], $resArr["inheritAccess"], $resArr["defaultAccess"], $lock, $resArr["keywords"], $resArr["sequence"]);
|
||||
$document = new $classname($resArr["id"], $resArr["name"], $resArr["comment"], $resArr["date"], $resArr["expires"], $resArr["owner"], $resArr["folder"], $resArr["inheritAccess"], $resArr["defaultAccess"], $resArr['lock'], $resArr["keywords"], $resArr["sequence"]);
|
||||
$document->setDMS($dms);
|
||||
$document = $document->applyDecorators();
|
||||
return $document;
|
||||
|
|
|
@ -177,6 +177,22 @@ class SeedDMS_Core_Folder extends SeedDMS_Core_Object {
|
|||
return $sql;
|
||||
} /* }}} */
|
||||
|
||||
/**
|
||||
* Return a folder by its database record
|
||||
*
|
||||
* @param array $resArr array of folder data as returned by database
|
||||
* @param SeedDMS_Core_DMS $dms
|
||||
* @return SeedDMS_Core_Folder|bool instance of SeedDMS_Core_Folder if document exists
|
||||
*/
|
||||
public static function getInstanceByData($resArr, $dms) { /* {{{ */
|
||||
$classname = $dms->getClassname('folder');
|
||||
/** @var SeedDMS_Core_Folder $folder */
|
||||
$folder = new $classname($resArr["id"], $resArr["name"], $resArr["parent"], $resArr["comment"], $resArr["date"], $resArr["owner"], $resArr["inheritAccess"], $resArr["defaultAccess"], $resArr["sequence"]);
|
||||
$folder->setDMS($dms);
|
||||
$folder = $folder->applyDecorators();
|
||||
return $folder;
|
||||
} /* }}} */
|
||||
|
||||
/**
|
||||
* Return a folder by its id
|
||||
*
|
||||
|
@ -195,6 +211,8 @@ class SeedDMS_Core_Folder extends SeedDMS_Core_Object {
|
|||
else if (count($resArr) != 1)
|
||||
return null;
|
||||
|
||||
return self::getInstanceByData($resArr[0], $dms);
|
||||
|
||||
$resArr = $resArr[0];
|
||||
$classname = $dms->getClassname('folder');
|
||||
/** @var SeedDMS_Core_Folder $folder */
|
||||
|
@ -601,9 +619,11 @@ class SeedDMS_Core_Folder extends SeedDMS_Core_Object {
|
|||
if (is_bool($resArr) && $resArr == false)
|
||||
return false;
|
||||
|
||||
$classname = $this->_dms->getClassname('folder');
|
||||
$this->_subFolders = array();
|
||||
for ($i = 0; $i < count($resArr); $i++)
|
||||
$this->_subFolders[$i] = $this->_dms->getFolder($resArr[$i]["id"]);
|
||||
// $this->_subFolders[$i] = $this->_dms->getFolder($resArr[$i]["id"]);
|
||||
$this->_subFolders[$i] = $classname::getInstanceByData($resArr[$i], $this->_dms);
|
||||
}
|
||||
|
||||
return $this->_subFolders;
|
||||
|
@ -784,7 +804,7 @@ class SeedDMS_Core_Folder extends SeedDMS_Core_Object {
|
|||
$db = $this->_dms->getDB();
|
||||
|
||||
if (!isset($this->_documents)) {
|
||||
$queryStr = "SELECT * FROM `tblDocuments` WHERE `folder` = " . $this->_id;
|
||||
$queryStr = "SELECT `tblDocuments`.*, `tblDocumentLocks`.`userID` as `lock` FROM `tblDocuments` LEFT JOIN `tblDocumentLocks` ON `tblDocuments`.`id` = `tblDocumentLocks`.`document` WHERE `folder` = " . $this->_id;
|
||||
if ($orderby && $orderby[0]=="n") $queryStr .= " ORDER BY `name`";
|
||||
elseif($orderby && $orderby[0]=="s") $queryStr .= " ORDER BY `sequence`";
|
||||
elseif($orderby && $orderby[0]=="d") $queryStr .= " ORDER BY `date`";
|
||||
|
@ -801,9 +821,11 @@ class SeedDMS_Core_Folder extends SeedDMS_Core_Object {
|
|||
return false;
|
||||
|
||||
$this->_documents = array();
|
||||
$classname = $this->_dms->getClassname('document');
|
||||
foreach ($resArr as $row) {
|
||||
// array_push($this->_documents, new SeedDMS_Core_Document($row["id"], $row["name"], $row["comment"], $row["date"], $row["expires"], $row["owner"], $row["folder"], $row["inheritAccess"], $row["defaultAccess"], isset($row["lockUser"])?$row["lockUser"]:NULL, $row["keywords"], $row["sequence"]));
|
||||
array_push($this->_documents, $this->_dms->getDocument($row["id"]));
|
||||
$row['lock'] = !$row['lock'] ? -1 : $row['lock'];
|
||||
// array_push($this->_documents, $this->_dms->getDocument($row["id"]));
|
||||
array_push($this->_documents, $classname::getInstanceByData($row, $this->_dms));
|
||||
}
|
||||
}
|
||||
return $this->_documents;
|
||||
|
|
|
@ -12,11 +12,11 @@
|
|||
<email>uwe@steinmann.cx</email>
|
||||
<active>yes</active>
|
||||
</lead>
|
||||
<date>2019-08-07</date>
|
||||
<date>2019-12-13</date>
|
||||
<time>07:31:17</time>
|
||||
<version>
|
||||
<release>5.1.13</release>
|
||||
<api>5.1.13</api>
|
||||
<release>5.1.14</release>
|
||||
<api>5.1.14</api>
|
||||
</version>
|
||||
<stability>
|
||||
<release>stable</release>
|
||||
|
@ -24,9 +24,7 @@
|
|||
</stability>
|
||||
<license uri="http://opensource.org/licenses/gpl-license">GPL License</license>
|
||||
<notes>
|
||||
- add decorators
|
||||
- add new methods SeedDMS_Core_Document::isType(), SeedDMS_Core_Folder::isType(), SeedDMS_Core_DocumentContent::isType(). Use them instead of checking the class name.
|
||||
- skip a fileType with just a '.'
|
||||
- speed up SeedDMS_Core_Folder::getSubFolders() SeedDMS_Core_Folder::getDocuments() by minimizing the number of sql queries.
|
||||
</notes>
|
||||
<contents>
|
||||
<dir baseinstalldir="SeedDMS" name="/">
|
||||
|
@ -1693,5 +1691,23 @@ add method SeedDMS_Core_DatabaseAccess::setLogFp()
|
|||
- add new method SeedDMS_Core_Folder::empty()
|
||||
</notes>
|
||||
</release>
|
||||
<release>
|
||||
<date>2019-08-07</date>
|
||||
<time>07:31:17</time>
|
||||
<version>
|
||||
<release>5.1.13</release>
|
||||
<api>5.1.13</api>
|
||||
</version>
|
||||
<stability>
|
||||
<release>stable</release>
|
||||
<api>stable</api>
|
||||
</stability>
|
||||
<license uri="http://opensource.org/licenses/gpl-license">GPL License</license>
|
||||
<notes>
|
||||
- add decorators
|
||||
- add new methods SeedDMS_Core_Document::isType(), SeedDMS_Core_Folder::isType(), SeedDMS_Core_DocumentContent::isType(). Use them instead of checking the class name.
|
||||
- skip a fileType with just a '.'
|
||||
</notes>
|
||||
</release>
|
||||
</changelog>
|
||||
</package>
|
||||
|
|
Loading…
Reference in New Issue
Block a user