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:
Uwe Steinmann 2019-12-13 09:03:44 +01:00
parent f453cac8d2
commit 61f1ddbd08
3 changed files with 75 additions and 14 deletions

View File

@ -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;

View File

@ -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;

View File

@ -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>