public function tearDown() { $this->folder->remove(); $this->article->remove(); eZPendingActions::removeByAction('index_object'); $this->nodeIds = array(); $this->objectIds = array(); $anonymousUser = eZUser::fetchByName('anonymous'); eZUser::setCurrentlyLoggedInUser($anonymousUser, $anonymousUser->attribute('contentobject_id')); eZContentLanguage::expireCache(); parent::tearDown(); }
/** * Deletes a content object, or a list of content objects * * @param array $deleteIDArray * @param bool $moveToTrash * * @return array An array with operation status, always true */ public static function deleteObject($deleteIDArray, $moveToTrash = false) { $ini = eZINI::instance(); $delayedIndexingValue = $ini->variable('SearchSettings', 'DelayedIndexing'); if ($delayedIndexingValue === 'enabled' || $delayedIndexingValue === 'classbased') { $pendingActionsToDelete = array(); $classList = $ini->variable('SearchSettings', 'DelayedIndexingClassList'); // Will be used below if DelayedIndexing is classbased $assignedNodesByObject = array(); $nodesToDeleteByObject = array(); $aNodes = eZContentObjectTreeNode::fetch($deleteIDArray); if (!is_array($aNodes)) { $aNodes = array($aNodes); } foreach ($aNodes as $node) { $object = $node->object(); $objectID = $object->attribute('id'); $assignedNodes = $object->attribute('assigned_nodes'); // Only delete pending action if this is the last object's node that is requested for deletion // But $deleteIDArray can also contain all the object's node (mainly if this method is called programmatically) // So if this is not the last node, then store its id in a temp array // This temp array will then be compared to the whole object's assigned nodes array if (count($assignedNodes) > 1) { // $assignedNodesByObject will be used as a referent to check if we want to delete all lasting nodes if (!isset($assignedNodesByObject[$objectID])) { $assignedNodesByObject[$objectID] = array(); foreach ($assignedNodes as $assignedNode) { $assignedNodesByObject[$objectID][] = $assignedNode->attribute('node_id'); } } // Store the node assignment we want to delete // Then compare the array to the referent node assignment array $nodesToDeleteByObject[$objectID][] = $node->attribute('node_id'); $diff = array_diff($assignedNodesByObject[$objectID], $nodesToDeleteByObject[$objectID]); if (!empty($diff)) { continue; } } if ($delayedIndexingValue !== 'classbased' || is_array($classList) && in_array($object->attribute('class_identifier'), $classList)) { $pendingActionsToDelete[] = $objectID; } } if (!empty($pendingActionsToDelete)) { $filterConds = array('param' => array($pendingActionsToDelete)); eZPendingActions::removeByAction('index_object', $filterConds); } } eZContentObjectTreeNode::removeSubtrees($deleteIDArray, $moveToTrash); return array('status' => true); }
/** * Test for eZPendingActions::removeByAction() */ public function testRemoveByAction() { // Insert several fixtures at one time. Can't use @dataProvider to do that $fixtures = $this->providerForTestFecthByAction(); foreach ($fixtures as $fixture) { $this->insertPendingAction($fixture[0], $fixture[1], $fixture[2]); } eZPendingActions::removeByAction('test'); $res = eZPendingActions::fetchByAction('test'); $this->assertTrue(empty($res)); }
$entries = eZPendingActions::fetchByAction(eZSolr::PENDING_ACTION_INDEX_SUBTREE); if (!empty($entries)) { $parentNodeIDList = array(); foreach ($entries as $entry) { $parentNodeID = $entry->attribute('param'); $parentNodeIDList[] = (int) $parentNodeID; $offset = 0; while (true) { $nodes = eZContentObjectTreeNode::subTreeByNodeID(array('IgnoreVisibility' => true, 'Offset' => $offset, 'Limit' => $limit, 'Limitation' => array()), $parentNodeID); if (!empty($nodes) && is_array($nodes)) { foreach ($nodes as $node) { ++$offset; $cli->output("\tIndexing object ID #{$node->attribute('contentobject_id')}"); // delay commits with passing false for $commit parameter $eZSolr->addObject($node->attribute('object'), false); } // finish up with commit $eZSolr->commit(); // clear object cache to conserver memory eZContentObject::clearCache(); } else { break; // No valid nodes } } } eZPendingActions::removeByAction(eZSolr::PENDING_ACTION_INDEX_SUBTREE, array('param' => array($parentNodeIDList))); } if (!$isQuiet) { $cli->output("Done"); }
$entries = eZPendingActions::fetchByAction('index_subtree'); if (!empty($entries)) { $parentNodeIDList = array(); foreach ($entries as $entry) { $parentNodeID = $entry->attribute('param'); $parentNodeIDList[] = (int) $parentNodeID; $offset = 0; while (true) { $nodes = eZContentObjectTreeNode::subTreeByNodeID(array('IgnoreVisibility' => true, 'Offset' => $offset, 'Limit' => $limit, 'Limitation' => array()), $parentNodeID); if (!empty($nodes) && is_array($nodes)) { foreach ($nodes as $node) { ++$offset; $cli->output("\tIndexing object ID #{$node->attribute('contentobject_id')}"); // delay commits with passing false for $commit parameter $searchEngine->addObject($node->attribute('object'), false); } // finish up with commit $searchEngine->commit(); // clear object cache to conserve memory eZContentObject::clearCache(); } else { break; // No valid nodes } } } eZPendingActions::removeByAction('index_subtree', array('param' => array($parentNodeIDList))); } if (!$isQuiet) { $cli->output("Done"); }
public function unlock() { eZPendingActions::removeByAction(self::ACTION_KEY); }
/** * Deletes a content object, or a list of content objects * * @param array $deleteIDArray * @param bool $moveToTrash * * @return array An array with operation status, always true */ static public function deleteObject( $deleteIDArray, $moveToTrash = false ) { $ini = eZINI::instance(); $aNodes = eZContentObjectTreeNode::fetch( $deleteIDArray ); if( !is_array( $aNodes ) ) { $aNodes = array( $aNodes ); } $delayedIndexingValue = $ini->variable( 'SearchSettings', 'DelayedIndexing' ); if ( $delayedIndexingValue === 'enabled' || $delayedIndexingValue === 'classbased' ) { $pendingActionsToDelete = array(); $classList = $ini->variable( 'SearchSettings', 'DelayedIndexingClassList' ); // Will be used below if DelayedIndexing is classbased $assignedNodesByObject = array(); $nodesToDeleteByObject = array(); foreach ( $aNodes as $node ) { $object = $node->object(); $objectID = $object->attribute( 'id' ); $assignedNodes = $object->attribute( 'assigned_nodes' ); // Only delete pending action if this is the last object's node that is requested for deletion // But $deleteIDArray can also contain all the object's node (mainly if this method is called programmatically) // So if this is not the last node, then store its id in a temp array // This temp array will then be compared to the whole object's assigned nodes array if ( count( $assignedNodes ) > 1 ) { // $assignedNodesByObject will be used as a referent to check if we want to delete all lasting nodes if ( !isset( $assignedNodesByObject[$objectID] ) ) { $assignedNodesByObject[$objectID] = array(); foreach ( $assignedNodes as $assignedNode ) { $assignedNodesByObject[$objectID][] = $assignedNode->attribute( 'node_id' ); } } // Store the node assignment we want to delete // Then compare the array to the referent node assignment array $nodesToDeleteByObject[$objectID][] = $node->attribute( 'node_id' ); $diff = array_diff( $assignedNodesByObject[$objectID], $nodesToDeleteByObject[$objectID] ); if ( !empty( $diff ) ) // We still have more node assignments for object, pending action is not to be deleted considering this iteration { continue; } } if ( $delayedIndexingValue !== 'classbased' || ( is_array( $classList ) && in_array( $object->attribute( 'class_identifier' ), $classList ) ) ) { $pendingActionsToDelete[] = $objectID; } } if ( !empty( $pendingActionsToDelete ) ) { $filterConds = array( 'param' => array ( $pendingActionsToDelete ) ); eZPendingActions::removeByAction( 'index_object', $filterConds ); } } // Add assigned nodes to the clear cache list // This allows to clear assigned nodes separately (e.g. in reverse proxies) // as once content is removed, there is no more assigned nodes, and http cache clear is not possible any more. // See https://jira.ez.no/browse/EZP-22447 foreach ( $aNodes as $node ) { eZContentCacheManager::addAdditionalNodeIDPerObject( $node->attribute( 'contentobject_id' ), $node->attribute( 'node_id' ) ); } eZContentObjectTreeNode::removeSubtrees( $deleteIDArray, $moveToTrash ); return array( 'status' => true ); }