/**
* 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 mixed $locationId
* @param mixed $contentId @todo Make use of this, or remove if not needed.
*/
public function deleteLocation($locationId, $contentId)
{
// 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), $this->documentTypeName);
$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), $this->documentTypeName);
}