]> git.mxchange.org Git - core.git/blobdiff - framework/main/classes/database/result/class_CachedDatabaseResult.php
Continued:
[core.git] / framework / main / classes / database / result / class_CachedDatabaseResult.php
index 12593ac5a8436a684e768b2a6fc50ce56c0e041c..c79eabfdb90077856adf610c06f29e7c38febb67 100644 (file)
@@ -6,13 +6,15 @@ namespace Org\Mxchange\CoreFramework\Result\Database;
 use Org\Mxchange\CoreFramework\Criteria\Local\LocalSearchCriteria;
 use Org\Mxchange\CoreFramework\Criteria\Local\LocalUpdateCriteria;
 use Org\Mxchange\CoreFramework\Criteria\Storing\StoreableCriteria;
-use Org\Mxchange\CoreFramework\Database\Frontend\DatabaseWrapper;
+use Org\Mxchange\CoreFramework\Database\Frontend\DatabaseFrontend;
 use Org\Mxchange\CoreFramework\Database\Backend\BaseDatabaseBackend;
+use Org\Mxchange\CoreFramework\Result\Database\BaseDatabaseResult;
 use Org\Mxchange\CoreFramework\Result\Search\SearchableResult;
 use Org\Mxchange\CoreFramework\Result\Update\UpdateableResult;
 
 // Import SPL stuff
 use \InvalidArgumentException;
+use \OutOfBoundsException;
 use \SeekableIterator;
 
 /**
@@ -20,7 +22,7 @@ use \SeekableIterator;
  *
  * @author             Roland Haeder <webmaster@shipsimu.org>
  * @version            0.0.0
- * @copyright  Copyright (c) 2007, 2008 Roland Haeder, 2009 - 2017 Core Developer Team
+ * @copyright  Copyright (c) 2007, 2008 Roland Haeder, 2009 - 2023 Core Developer Team
  * @license            GNU GPL 3.0 or any newer version
  * @link               http://www.shipsimu.org
  *
@@ -77,9 +79,13 @@ class CachedDatabaseResult extends BaseDatabaseResult implements SearchableResul
         *
         * @return      void
         */
-       protected function __construct () {
+       private function __construct () {
                // Call parent constructor
+               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage('CACHED-DATABASE-RESULT: CONSTRUCTED!');
                parent::__construct(__CLASS__);
+
+               // Trace message
+               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage('CACHED-DATABASE-RESULT: EXIT!');
        }
 
        /**
@@ -91,24 +97,35 @@ class CachedDatabaseResult extends BaseDatabaseResult implements SearchableResul
         */
        public static final function createCachedDatabaseResult (array $resultArray) {
                // Misses an element?
+               //* DEBUG-DIE: */ die(sprintf('[%s:%d]: resultArray=%s', __METHOD__, __LINE__, print_r($resultArray, true)));
+               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage(sprintf('CACHED-DATABASE-RESULT: resultArray()=%d - CALLED!', count($resultArray)));
                if (count($resultArray) == 0) {
                        // Cannot be empty
-                       throw new InvalidArgumentException('Array "resultArray" cannot be empty.');
-               } elseif (!array_key_exists(BaseDatabaseBackend::RESULT_INDEX_ROWS, $resultArray)) {
+                       throw new InvalidArgumentException('Array "resultArray" is empty', FrameworkInterface::EXCEPTION_INVALID_ARGUMENT);
+               } elseif (!array_key_exists(BaseDatabaseResult::RESULT_NAME_ROWS, $resultArray)) {
+                       // Yes, then abort here
+                       throw new InvalidArgumentException(sprintf('resultArray(%d)=%s has no element "%s".', count($resultArray), print_r($resultArray, TRUE), BaseDatabaseResult::RESULT_NAME_ROWS));
+               } elseif (!array_key_exists(BaseDatabaseResult::RESULT_NAME_STATUS, $resultArray)) {
                        // Yes, then abort here
-                       throw new InvalidArgumentException(sprintf('resultArray(%d)=%s has no element "%s".', count($resultArray), print_r($resultArray, TRUE), BaseDatabaseBackend::RESULT_INDEX_ROWS));
+                       throw new InvalidArgumentException(sprintf('resultArray(%d)=%s has no element "%s".', count($resultArray), print_r($resultArray, TRUE), BaseDatabaseResult::RESULT_NAME_STATUS));
                }
 
                // Get a new instance
                $resultInstance = new CachedDatabaseResult();
 
                // Set the result array
+               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugMessage(sprintf('CACHED-DATABASE-RESULT: Setting resultArray()=%d ...', count($resultArray)));
                $resultInstance->setResultArray($resultArray);
 
+               // Reset current position
+               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage('CACHED-DATABASE-RESULT: Invoking resultInstance->resetCurrentPosition() ...');
+               $resultInstance->resetCurrentPosition();
+
                // Set affected rows
-               $resultInstance->setAffectedRows(count($resultArray[BaseDatabaseBackend::RESULT_INDEX_ROWS]));
+               $resultInstance->setAffectedRows(count($resultArray[BaseDatabaseResult::RESULT_NAME_ROWS]));
 
                // Return the instance
+               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage(sprintf('CACHED-DATABASE-RESULT: resultInstance=%s - EXIT!', $resultInstance->__toString()));
                return $resultInstance;
        }
 
@@ -130,16 +147,21 @@ class CachedDatabaseResult extends BaseDatabaseResult implements SearchableResul
         */
        private function updateCurrentEntryByCriteria (LocalUpdateCriteria $updateInstance) {
                // Get the current entry key
+               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage(sprintf('CACHED-DATABASE-RESULT: updateInstance=%s - CALLED!', $updateInstance->__toString()));
                $entryKey = $this->key();
 
                // Now get the update criteria array and update all entries
                foreach ($updateInstance->getUpdateCriteria() as $criteriaKey => $criteriaValue) {
                        // Update data
-                       $this->resultArray[BaseDatabaseBackend::RESULT_INDEX_ROWS][$entryKey][$criteriaKey] = $criteriaValue;
+                       //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugMessage(sprintf('CACHED-DATABASE-RESULT: criteriaKey=%s,criteriaValue[%s]=%s', $criteriaKey, gettype($criteriaValue), $criteriaValue));
+                       $this->resultArray[BaseDatabaseResult::RESULT_NAME_ROWS][$entryKey][$criteriaKey] = $criteriaValue;
 
                        // Mark it as out-dated
                        $this->outDated[$criteriaKey] = 1;
-               } // END - foreach
+               }
+
+               // Trace message
+               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage('CACHED-DATABASE-RESULT: EXIT!');
        }
 
        /**
@@ -150,35 +172,51 @@ class CachedDatabaseResult extends BaseDatabaseResult implements SearchableResul
         */
        public function next () {
                // Default is not valid
+               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage('CACHED-DATABASE-RESULT: CALLED!');
                $nextValid = false;
 
+               // Increase position
+               $this->currentPos++;
+
                // Is the result valid?
                if ($this->valid()) {
-                       // Next entry found, so count one up and cache it
-                       $this->currentPos++;
-                       $this->currentRow = $this->resultArray[BaseDatabaseBackend::RESULT_INDEX_ROWS][$this->currentPos];
+                       // Next entry found, so cache it
+                       $this->currentRow = $this->resultArray[BaseDatabaseResult::RESULT_NAME_ROWS][$this->currentPos];
                        $nextValid = true;
-               } // END - if
+               }
 
                // Return the result
+               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage(sprintf('CACHED-DATABASE-RESULT: nextValid=%d - EXIT!', intval($nextValid)));
                return $nextValid;
        }
 
        /**
         * Seeks for to a specified position
         *
-        * @param       $index  Index to seek for
+        * @param       $seekPosition   Position to seek to
         * @return      void
+        * @throws      OutOfBoundsException    If the position is not seekable
         */
-       public function seek ($index) {
+       public function seek (int $seekPosition) {
+               // Validate parameter
+               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage(sprintf('CACHED-DATABASE-RESULT: seekPosition=%d - CALLED!', $seekPosition));
+               if ($seekPosition < 0) {
+                       // Throw exception
+                       throw new OutOfBoundsException(sprintf('seekPositon=%d is not seekable', $seekPosition));
+               }
+
                // Rewind to beginning
                $this->rewind();
 
                // Search for the entry
-               while (($this->currentPos < $index) && ($this->valid())) {
+               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugMessage(sprintf('CACHED-DATABASE-RESULT: this->currentPos=%d,seekPosition=%d', $this->currentPos, $seekPosition));
+               while (($this->currentPos < $seekPosition) && ($this->valid())) {
                        // Continue on
                        $this->next();
-               } // END - while
+               }
+
+               // Trace message
+               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage('CACHED-DATABASE-RESULT: EXIT!');
        }
 
        /**
@@ -188,15 +226,17 @@ class CachedDatabaseResult extends BaseDatabaseResult implements SearchableResul
         */
        public function current () {
                // Default is not found
+               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage('CACHED-DATABASE-RESULT: CALLED!');
                $current = NULL;
 
                // Does the current enty exist?
-               if (isset($this->resultArray[BaseDatabaseBackend::RESULT_INDEX_ROWS][$this->currentPos])) {
+               if (isset($this->resultArray[BaseDatabaseResult::RESULT_NAME_ROWS][$this->currentPos])) {
                        // Then get it
-                       $current = $this->resultArray[BaseDatabaseBackend::RESULT_INDEX_ROWS][$this->currentPos];
-               } // END - if
+                       $current = $this->resultArray[BaseDatabaseResult::RESULT_NAME_ROWS][$this->currentPos];
+               }
 
                // Return the result
+               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage(sprintf('CACHED-DATABASE-RESULT: current[]=%s - EXIT!', gettype($current)));
                return $current;
        }
 
@@ -206,19 +246,12 @@ class CachedDatabaseResult extends BaseDatabaseResult implements SearchableResul
         * @return      $isValid Whether the next/rewind entry is valid
         */
        public function valid () {
-               // By default nothing is valid
-               $isValid = false;
-
-               // Debug message
-               //*NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugOutput('[' . __METHOD__ . ':' . __LINE__ . '] this->currentPos=' . $this->currentPos);
-
                // Check if all is fine ...
-               if (($this->ifStatusIsOkay()) && (isset($this->resultArray[BaseDatabaseBackend::RESULT_INDEX_ROWS][($this->currentPos + 1)])) && (isset($this->resultArray[BaseDatabaseBackend::RESULT_INDEX_ROWS][0]))) {
-                       // All fine!
-                       $isValid = true;
-               } // END - if
+               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage(sprintf('CACHED-DATABASE-RESULT: this->currentPos=%d - CALLED!', $this->currentPos));
+               $isValid = ($this->ifStatusIsOkay() && isset($this->resultArray[BaseDatabaseResult::RESULT_NAME_ROWS][$this->currentPos]) && isset($this->resultArray[BaseDatabaseResult::RESULT_NAME_ROWS][0]));
 
                // Return the result
+               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage(sprintf('CACHED-DATABASE-RESULT: isValid=%d - EXIT!', intval($isValid)));
                return $isValid;
        }
 
@@ -228,8 +261,13 @@ class CachedDatabaseResult extends BaseDatabaseResult implements SearchableResul
         * @return      $isValid Whether the next/rewind entry is valid
         */
        public function count () {
+               // Count rows
+               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage('CACHED-DATABASE-RESULT: CALLED!');
+               $count = count($this->resultArray[BaseDatabaseResult::RESULT_NAME_ROWS]);
+
                // Return it
-               return count($this->resultArray[BaseDatabaseBackend::RESULT_INDEX_ROWS]);
+               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage(sprintf('CACHED-DATABASE-RESULT: count=%d - EXIT!', $count));
+               return $count;
        }
 
        /**
@@ -238,8 +276,12 @@ class CachedDatabaseResult extends BaseDatabaseResult implements SearchableResul
         * @return      $ifStatusOkay   Whether the status of the query was okay
         */
        public function ifStatusIsOkay () {
-               $ifStatusOkay = ((isset($this->resultArray[BaseDatabaseBackend::RESULT_INDEX_STATUS])) && ($this->resultArray[BaseDatabaseBackend::RESULT_INDEX_STATUS] === BaseDatabaseBackend::RESULT_OKAY));
-               //*NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugOutput('[' . __METHOD__ . ':' . __LINE__ . '] ifStatusOkay=' . intval($ifStatusOkay));
+               // Check all conditions
+               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage(sprintf('CACHED-DATABASE-RESULT: this->currentPos=%d - CALLED!', $this->currentPos));
+               $ifStatusOkay = (isset($this->resultArray[BaseDatabaseResult::RESULT_NAME_STATUS]) && $this->resultArray[BaseDatabaseResult::RESULT_NAME_STATUS] === BaseDatabaseBackend::RESULT_OKAY);
+
+               // Return status
+               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage(sprintf('CACHED-DATABASE-RESULT: ifStatusOkay=%s - EXIT!', intval($ifStatusOkay)));
                return $ifStatusOkay;
        }
 
@@ -249,6 +291,8 @@ class CachedDatabaseResult extends BaseDatabaseResult implements SearchableResul
         * @return      $currentPos     Key from iterator
         */
        public function key () {
+               // Return current array position
+               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage(sprintf('CACHED-DATABASE-RESULT: this->currentPos=%d - CALLED!', $this->currentPos));
                return $this->currentPos;
        }
 
@@ -258,8 +302,28 @@ class CachedDatabaseResult extends BaseDatabaseResult implements SearchableResul
         * @return      void
         */
        public function rewind () {
-               $this->currentPos = -1;
+               // Reset both current array position and current row
+               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage(sprintf('CACHED-DATABASE-RESULT: this->currentPos=%d - CALLED!', $this->currentPos));
+               $this->resetCurrentPosition();
                $this->currentRow = [];
+
+               // Trace message
+               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage('CACHED-DATABASE-RESULT: EXIT!');
+       }
+
+       /**
+        * Resets current array position to 0 if at least one record is there or -1
+        * if no record is there.
+        *
+        * @return      void
+        */
+       private function resetCurrentPosition () {
+               // Reset position
+               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage('CACHED-DATABASE-RESULT: CALLED!');
+               $this->currentPos = ($this->count() > 0 ? 0 : -1);
+
+               // Trace message
+               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage(sprintf('CACHED-DATABASE-RESULT: this->currentPos=%d - EXIT!', $this->currentPos));
        }
 
        /**
@@ -270,52 +334,71 @@ class CachedDatabaseResult extends BaseDatabaseResult implements SearchableResul
         * @todo        0% done
         */
        public function searchEntry (LocalSearchCriteria $criteriaInstance) {
-               $this->debugBackTrace('[' . '[' . __METHOD__ . ':' . __LINE__ . ']:  Unfinished!');
+               // Unfinished code
+               $this->debugBackTrace(sprintf('[%s:%d]: criteriaInstance=%s', __METHOD__, __LINE__, print_r($criteriaInstance, TRUE)));
        }
 
        /**
         * Adds an update request to the database result for writing it to the
         * database layer
         *
-        * @param       $criteriaInstance       An instance of a updateable criteria
+        * @param       $updateInstance An instance of a updateable criteria
         * @return      void
         * @throws      ResultUpdateException   If no result was updated
         */
-       public function add2UpdateQueue (LocalUpdateCriteria $criteriaInstance) {
+       public function add2UpdateQueue (LocalUpdateCriteria $updateInstance) {
                // Rewind the pointer
+               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage(sprintf('CACHED-DATABASE-RESULT: updateInstance=%s - CALLED!', $updateInstance->__toString()));
                $this->rewind();
 
                // Get search criteria
-               $searchInstance = $criteriaInstance->getSearchInstance();
+               $searchInstance = $updateInstance->getSearchInstance();
+
+               // Get affected rows
+               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugMessage(sprintf('CACHED-DATABASE-RESULT: searchInstance=%s', $searchInstance->__toString()));
+               $foundEntries = $this->getAffectedRows();
 
                // And start looking for the result
-               $foundEntries = 0;
+               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugMessage(sprintf('CACHED-DATABASE-RESULT: foundEntries=%d,searchInstance->limit=%d', $foundEntries, $searchInstance->getLimit()));
                while (($this->valid()) && ($foundEntries < $searchInstance->getLimit())) {
                        // Get next entry
+                       //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage('CACHED-DATABASE-RESULT: Invoking this->next() ...');
                        $this->next();
+
+                       // Get current entry
+                       //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage('CACHED-DATABASE-RESULT: Invoking this->current() ...');
                        $currentEntry = $this->current();
 
                        // Is this entry found?
+                       //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage(sprintf('CACHED-DATABASE-RESULT: currentEntry[]=%s - EXIT!', gettype($currentEntry)));
                        if ($searchInstance->ifEntryMatches($currentEntry)) {
                                // Update this entry
-                               $this->updateCurrentEntryByCriteria($criteriaInstance);
+                               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage(sprintf('CACHED-DATABASE-RESULT: Invoking this->updateCurrentEntryByCriteria(%s) ...', $updateInstance->__toString()));
+                               $this->updateCurrentEntryByCriteria($updateInstance);
 
                                // Count one up
                                $foundEntries++;
-                       } // END - if
-               } // END - while
+                               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugMessage(sprintf('CACHED-DATABASE-RESULT: foundEntries=%d', $foundEntries));
+                       }
+               }
 
                // If no entry is found/updated throw an exception
+               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugMessage(sprintf('CACHED-DATABASE-RESULT: foundEntries=%d', $foundEntries));
                if ($foundEntries == 0) {
                        // Throw an exception here
                        throw new ResultUpdateException($this, self::EXCEPTION_RESULT_UPDATE_FAILED);
-               } // END - if
+               }
 
                // Set affected rows
+               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage(sprintf('CACHED-DATABASE-RESULT: Invoking this->setAffectedRows(%d) ...', $foundEntries));
                $this->setAffectedRows($foundEntries);
 
                // Set update instance
-               $this->setUpdateInstance($criteriaInstance);
+               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage(sprintf('CACHED-DATABASE-RESULT: Invoking this->setUpdateInstance(%s) ...', $updateInstance->__toString()));
+               $this->setUpdateInstance($updateInstance);
+
+               // Trace message
+               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage('CACHED-DATABASE-RESULT: EXIT!');
        }
 
        /**
@@ -324,7 +407,7 @@ class CachedDatabaseResult extends BaseDatabaseResult implements SearchableResul
         * @param       $rows   Number of affected rows
         * @return      void
         */
-       public final function setAffectedRows ($rows) {
+       public final function setAffectedRows (int $rows) {
                $this->affectedRows = $rows;
        }
 
@@ -352,7 +435,12 @@ class CachedDatabaseResult extends BaseDatabaseResult implements SearchableResul
         * @return      $needsUpdate    Whether we have out-dated entries
         */
        public function ifDataNeedsFlush () {
+               // Check if records are out-dated
+               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage('CACHED-DATABASE-RESULT: CALLED!');
                $needsUpdate = (count($this->outDated) > 0);
+
+               // Return it
+               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage(sprintf('CACHED-DATABASE-RESULT: needsUpdate=%d - EXIT!', intval($needsUpdate)));
                return $needsUpdate;
        }
 
@@ -364,14 +452,19 @@ class CachedDatabaseResult extends BaseDatabaseResult implements SearchableResul
         */
        public function addElementsToDataSet (StoreableCriteria $criteriaInstance) {
                // Walk only through out-dated columns
+               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage(sprintf('CACHED-DATABASE-RESULT: criteriaInstance=%s - CALLED!', $criteriaInstance->__toString()));
                foreach ($this->outDated as $key => $dummy) {
                        // Does this key exist?
-                       //* DEBUG: */ echo "outDated: {$key}<br />\n";
+                       //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugMessage(sprintf('CACHED-DATABASE-RESULT: key=%s,dummy[]=%s', $key, gettype($dummy)));
                        if ($this->find($key)) {
                                // Then update it
+                               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage(sprintf('CACHED-DATABASE-RESULT: Invoking criteriaInstance->addCriteria(%s,foundValue[]=%s) ...', $key, gettype($this->getFoundValue())));
                                $criteriaInstance->addCriteria($key, $this->getFoundValue());
-                       } // END - if
-               } // END - foreach
+                       }
+               }
+
+               // Trace message
+               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage('CACHED-DATABASE-RESULT: EXIT!');
        }
 
        /**
@@ -379,36 +472,51 @@ class CachedDatabaseResult extends BaseDatabaseResult implements SearchableResul
         *
         * @param       $key    The key we shall find
         * @return      $found  Whether the key was found or not
+        * @throws      InvalidArgumentException        If a parameter is invalid
         */
-       public function find ($key) {
+       public function find (string $key) {
+               // Check parameter
+               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage(sprintf('CACHED-DATABASE-RESULT: key=%s - CALLED!', $key));
+               if (empty($key)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "key" is empty', FrameworkInterface::EXCEPTION_INVALID_ARGUMENT);
+               }
+
                // By default nothing is found
                $found = false;
 
                // Rewind the pointer
+               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage('CACHED-DATABASE-RESULT: Invoking this->rewind() ...');
                $this->rewind();
 
                // Walk through all entries
                while ($this->valid()) {
                        // Advance to next entry
+                       //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage('CACHED-DATABASE-RESULT: Invoking this->next() ...');
                        $this->next();
 
                        // Get the whole array
                        $currentEntry = $this->current();
 
                        // Is the element there?
+                       //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage(sprintf('CACHED-DATABASE-RESULT: currentEntry[]=%s - EXIT!', gettype($currentEntry)));
                        if (isset($currentEntry[$key])) {
                                // Okay, found!
+                               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugMessage(sprintf('CACHED-DATABASE-RESULT: key=%s is found in currentEntry', $key));
                                $found = true;
 
                                // So "cache" it
+                               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugMessage(sprintf('CACHED-DATABASE-RESULT: Setting this->foundValue to currentEntry[%s][]=%s is found in currentEntry', $key, gettype($currentEntry[$key])));
                                $this->foundValue = $currentEntry[$key];
 
                                // And stop searching
+                               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugMessage('CACHED-DATABASE-RESULT: BREAK!');
                                break;
-                       } // END - if
-               } // END - while
+                       }
+               }
 
                // Return the result
+               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage(sprintf('CACHED-DATABASE-RESULT: found=%d - EXIT!', intval($found)));
                return $found;
        }
 
@@ -416,27 +524,48 @@ class CachedDatabaseResult extends BaseDatabaseResult implements SearchableResul
         * Solver for result index value with call-back method
         *
         * @param       $databaseColumn         Database column where the index might be found
-        * @param       $wrapperInstance        The wrapper instance to ask for array element
-        * @para        $callBack                       Call-back object for setting the index;
+        * @param       $frontendInstance       The frontend instance to ask for array element
+        * @para        $callback                       Call-back object for setting the index;
         *                                                              0=object instance,1=method name
         * @return      void
+        * @throws      InvalidArgumentException        If a parameter is invalid
         * @todo        Find a caching way without modifying the result array
         */
-       public function solveResultIndex ($databaseColumn, DatabaseWrapper $wrapperInstance, array $callBack) {
+       public function solveResultIndex (string $databaseColumn, DatabaseFrontend $frontendInstance, array $callback) {
+               // Check parameter
+               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage(sprintf('CACHED-DATABASE-RESULT: databaseColumn=%s,frontendInstance=%s,callback()=%d - CALLED!', $databaseColumn, $frontendInstance->__toString(), count($callback)));
+               if (empty($key)) {
+                       // Throw IAE
+                       throw new InvalidArgumentException('Parameter "key" is empty', FrameworkInterface::EXCEPTION_INVALID_ARGUMENT);
+               } elseif (count($callback) != 2) {
+                       // Throw it again
+                       throw new InvalidArgumentException(sprintf('callback()=%d must be exactly 2', count($callback)), FrameworkInterface::EXCEPTION_INVALID_ARGUMENT);
+               } elseif (!is_callable($callback)) {
+                       // Throw it again
+                       throw new InvalidArgumentException(sprintf('%s:%s() is not callable', $callback[0], $callback[1]), FrameworkInterface::EXCEPTION_INVALID_ARGUMENT);
+               }
+
                // By default nothing is found
                $indexValue = 0;
 
                // Is the element in result itself found?
+               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage(sprintf('CACHED-DATABASE-RESULT: Invoking this->find(%s),frontendInstance->indexKey=%s ...', $databaseColumn, $frontendInstance->getIndexKey()));
                if ($this->find($databaseColumn)) {
                        // Use this value
                        $indexValue = $this->getFoundValue();
-               } elseif ($this->find($wrapperInstance->getIndexKey())) {
+                       //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugMessage(sprintf('CACHED-DATABASE-RESULT: indexValue[]=%s from this->find(%s) - databaseColumn', gettype($indexValue), $databaseColumn));
+               } elseif ($this->find($frontendInstance->getIndexKey())) {
                        // Use this value
                        $indexValue = $this->getFoundValue();
+                       //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->debugMessage(sprintf('CACHED-DATABASE-RESULT: indexValue[]=%s from this->find(%s) - frontendInstance->indexKey', gettype($indexValue), $frontendInstance->getIndexKey()));
                }
 
                // Set the index
-               call_user_func_array($callBack, array($indexValue));
+               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage(sprintf('CACHED-DATABASE-RESULT: Invoking %s:%s(indexValue[]=%s) ...', $callback[0], $callback[1], gettype($indexValue)));
+               call_user_func_array($callback, [$indexValue]);
+
+               // Trace message
+               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__, __LINE__)->traceMessage('CACHED-DATABASE-RESULT: EXIT!');
        }
 
 }