aboutsummaryrefslogtreecommitdiff
path: root/engine
diff options
context:
space:
mode:
authorSteve Clay <steve@mrclay.org>2013-06-08 21:34:11 -0400
committerSteve Clay <steve@mrclay.org>2013-06-08 21:34:11 -0400
commit8a47b2342e53c9cdf3093982486b19d6cc2f3e9b (patch)
tree38580c9ead3830e100da483f4e21d9198b9f8bc3 /engine
parent3a3a520958e1eb31ac9d20e7cb818d8c3b5fff4a (diff)
downloadelgg-8a47b2342e53c9cdf3093982486b19d6cc2f3e9b.tar.gz
elgg-8a47b2342e53c9cdf3093982486b19d6cc2f3e9b.tar.bz2
Improved algorithm by tracking total incomplete entities
Diffstat (limited to 'engine')
-rw-r--r--engine/classes/ElggBatch.php18
-rw-r--r--engine/tests/api/helpers.php16
2 files changed, 20 insertions, 14 deletions
diff --git a/engine/classes/ElggBatch.php b/engine/classes/ElggBatch.php
index ac79cf084..d810ea066 100644
--- a/engine/classes/ElggBatch.php
+++ b/engine/classes/ElggBatch.php
@@ -157,6 +157,13 @@ class ElggBatch
private $incompleteEntities = array();
/**
+ * Total number of incomplete entities fetched
+ *
+ * @var int
+ */
+ private $totalIncompletes = 0;
+
+ /**
* Batches operations on any elgg_get_*() or compatible function that supports
* an options array.
*
@@ -242,12 +249,9 @@ class ElggBatch
/**
* Fetches the next chunk of results
*
- * @param int $num_incompletes_last_fetch When called recursively, this is the number of
- * incomplete entities returned in the last fetch.
- *
* @return bool
*/
- private function getNextResultsChunk($num_incompletes_last_fetch = 0) {
+ private function getNextResultsChunk() {
// always reset results.
$this->results = array();
@@ -281,7 +285,7 @@ class ElggBatch
if ($this->incrementOffset) {
$offset = $this->offset + $this->retrievedResults;
} else {
- $offset = $this->offset + $num_incompletes_last_fetch;
+ $offset = $this->offset + $this->totalIncompletes;
}
$current_options = array(
@@ -298,6 +302,8 @@ class ElggBatch
$num_results = count($this->results);
$num_incomplete = count($this->incompleteEntities);
+ $this->totalIncompletes += $num_incomplete;
+
if ($this->incompleteEntities) {
// pad the front of the results with nulls representing the incompletes
array_splice($this->results, 0, 0, array_pad(array(), $num_incomplete, null));
@@ -318,7 +324,7 @@ class ElggBatch
if ($num_results == 0) {
// This fetch was *all* incompletes! We need to fetch until we can either
// offer at least one row to iterate over, or give up.
- return $this->getNextResultsChunk($num_incomplete);
+ return $this->getNextResultsChunk();
}
return true;
} else {
diff --git a/engine/tests/api/helpers.php b/engine/tests/api/helpers.php
index 06ef55138..10216140f 100644
--- a/engine/tests/api/helpers.php
+++ b/engine/tests/api/helpers.php
@@ -579,7 +579,7 @@ class ElggCoreHelpersTest extends ElggCoreUnitTest {
}
public function testElggBatchReadHandlesBrokenEntities() {
- $num_test_entities = 6;
+ $num_test_entities = 8;
$guids = array();
for ($i = $num_test_entities; $i > 0; $i--) {
$entity = new ElggObject();
@@ -592,11 +592,11 @@ class ElggCoreHelpersTest extends ElggCoreUnitTest {
}
// break entities such that the first fetch has one incomplete
- // and the second fetch has only incompletes!
+ // and the second and third fetches have only incompletes!
$db_prefix = elgg_get_config('dbprefix');
delete_data("
DELETE FROM {$db_prefix}objects_entity
- WHERE guid IN ({$guids[1]}, {$guids[2]}, {$guids[3]})
+ WHERE guid IN ({$guids[1]}, {$guids[2]}, {$guids[3]}, {$guids[4]}, {$guids[5]})
");
$options = array(
@@ -613,7 +613,7 @@ class ElggCoreHelpersTest extends ElggCoreUnitTest {
}
// The broken entities should not have been visited
- $this->assertEqual($entities_visited, array($guids[0], $guids[4], $guids[5]));
+ $this->assertEqual($entities_visited, array($guids[0], $guids[6], $guids[7]));
// cleanup (including leftovers from previous tests)
$entity_rows = elgg_get_entities(array_merge($options, array(
@@ -629,7 +629,7 @@ class ElggCoreHelpersTest extends ElggCoreUnitTest {
}
public function testElggBatchDeleteHandlesBrokenEntities() {
- $num_test_entities = 6;
+ $num_test_entities = 8;
$guids = array();
for ($i = $num_test_entities; $i > 0; $i--) {
$entity = new ElggObject();
@@ -642,11 +642,11 @@ class ElggCoreHelpersTest extends ElggCoreUnitTest {
}
// break entities such that the first fetch has one incomplete
- // and the second fetch has only incompletes!
+ // and the second and third fetches have only incompletes!
$db_prefix = elgg_get_config('dbprefix');
delete_data("
DELETE FROM {$db_prefix}objects_entity
- WHERE guid IN ({$guids[1]}, {$guids[2]}, {$guids[3]})
+ WHERE guid IN ({$guids[1]}, {$guids[2]}, {$guids[3]}, {$guids[4]}, {$guids[5]})
");
$options = array(
@@ -664,7 +664,7 @@ class ElggCoreHelpersTest extends ElggCoreUnitTest {
}
// The broken entities should not have been visited
- $this->assertEqual($entities_visited, array($guids[0], $guids[4], $guids[5]));
+ $this->assertEqual($entities_visited, array($guids[0], $guids[6], $guids[7]));
// cleanup (including leftovers from previous tests)
$entity_rows = elgg_get_entities(array_merge($options, array(