/** * Indexes several Locations * * @todo: This function and setCommit() is needed for Persistence\Solr for test speed but not part * of interface for the reason described in Solr\Content\Search\Gateway\Native::bulkIndexContent * Short: Bulk handling should be properly designed before added to the interface. * * @param \eZ\Publish\SPI\Persistence\Content\Location[] $locations */ public function bulkIndexLocations(array $locations) { $documents = array(); foreach ($locations as $location) { $documents[] = $this->mapper->mapContentLocation($location); } $this->gateway->bulkIndex($documents); }
/** * Deletes a location from the index * * @todo When we support Location-less Content, we will have to reindex instead of removing * @todo Should we not already support the above? * @todo The subtree could potentially be huge, so this implementation should scroll reindex * * @param int|string $locationId */ public function deleteLocation($locationId) { // 1. Update (reindex) all Content in the subtree with additional Location(s) outside of it $ast = array("filter" => array("nested" => array("path" => "locations_doc", "filter" => array("and" => array(0 => array("regexp" => array("locations_doc.path_string_id" => ".*/{$locationId}/.*")), 1 => array("regexp" => array("locations_doc.path_string_id" => array("value" => "@&~(.*/{$locationId}/.*)", "flags" => "INTERSECTION|COMPLEMENT|ANYSTRING")))))))); $response = $this->gateway->findRaw(json_encode($ast), "content"); $result = json_decode($response->body); $documents = array(); foreach ($result->hits->hits as $hit) { $documents[] = $this->mapper->mapContentById($hit->_id); } $this->gateway->bulkIndex($documents); // 2. Delete all Content in the subtree with no other Location(s) outside of it $ast["filter"]["nested"]["filter"]["and"][1] = array("not" => $ast["filter"]["nested"]["filter"]["and"][1]); $ast = array("query" => array("filtered" => $ast)); $this->gateway->deleteByQuery(json_encode($ast), "content"); }