public UpdateAttributes ( $index, $attrs, $values, $mva = false ) |
function UpdateAttributes($index, $attrs, $values, $mva = false)
{
// verify everything
assert(is_string($index));
assert(is_bool($mva));
assert(is_array($attrs));
foreach ($attrs as $attr) {
assert(is_string($attr));
}
assert(is_array($values));
foreach ($values as $id => $entry) {
assert(is_numeric($id));
assert(is_array($entry));
assert(count($entry) == count($attrs));
foreach ($entry as $v) {
if ($mva) {
assert(is_array($v));
foreach ($v as $vv) {
assert(is_int($vv));
}
} else {
assert(is_int($v));
}
}
}
// build request
$this->_MBPush();
$req = pack("N", strlen($index)) . $index;
$req .= pack("N", count($attrs));
foreach ($attrs as $attr) {
$req .= pack("N", strlen($attr)) . $attr;
$req .= pack("N", $mva ? 1 : 0);
}
$req .= pack("N", count($values));
foreach ($values as $id => $entry) {
$req .= sphPackU64($id);
foreach ($entry as $v) {
$req .= pack("N", $mva ? count($v) : $v);
if ($mva) {
foreach ($v as $vv) {
$req .= pack("N", $vv);
}
}
}
}
// connect, send query, get response
if (!($fp = $this->_Connect())) {
$this->_MBPop();
return -1;
}
$len = strlen($req);
$req = pack("nnN", SEARCHD_COMMAND_UPDATE, VER_COMMAND_UPDATE, $len) . $req;
// add header
if (!$this->_Send($fp, $req, $len + 8)) {
$this->_MBPop();
return -1;
}
if (!($response = $this->_GetResponse($fp, VER_COMMAND_UPDATE))) {
$this->_MBPop();
return -1;
}
// parse response
list(, $updated) = unpack("N*", substr($response, 0, 4));
$this->_MBPop();
return $updated;
}
/** * {@inheritdoc} */ public function removeRecord(\record_adapter $record) { if (!$this->rt_conn) { throw new RuntimeException('Unable to connect to sphinx real-time index'); } $CRCdatabox = $this->CRCdatabox($record->get_databox()); $indexes = ["metadatas" . $CRCdatabox, "metadatas" . $CRCdatabox . "_stemmed_en", "metadatas" . $CRCdatabox . "_stemmed_fr", "metadatas" . $CRCdatabox . "_stemmed_de", "metadatas" . $CRCdatabox . "_stemmed_nl"]; $RTindexes = ["metas_realtime" . $CRCdatabox, "metas_realtime_stemmed_fr_" . $CRCdatabox, "metas_realtime_stemmed_en_" . $CRCdatabox, "metas_realtime_stemmed_nl_" . $CRCdatabox, "metas_realtime_stemmed_de_" . $CRCdatabox]; foreach ($record->get_caption()->get_fields(null, true) as $field) { foreach ($field->get_values() as $value) { foreach ($indexes as $index) { $this->sphinx->UpdateAttributes($index, ["deleted"], [$value->getId() => [1]]); } foreach ($RTindexes as $index) { $this->rt_conn->exec("DELETE FROM " . $index . " WHERE id = " . $value->getId()); } } } $indexes = ["documents" . $CRCdatabox, "documents" . $CRCdatabox . "_stemmed_fr", "documents" . $CRCdatabox . "_stemmed_en", "documents" . $CRCdatabox . "_stemmed_de", "documents" . $CRCdatabox . "_stemmed_nl"]; $RTindexes = ["docs_realtime" . $CRCdatabox, "docs_realtime_stemmed_fr_" . $CRCdatabox, "docs_realtime_stemmed_en_" . $CRCdatabox, "docs_realtime_stemmed_nl_" . $CRCdatabox, "docs_realtime_stemmed_de_" . $CRCdatabox]; foreach ($indexes as $index) { $this->sphinx->UpdateAttributes($index, ["deleted"], [$record->get_record_id() => [1]]); } foreach ($RTindexes as $index) { $this->rt_conn->exec("DELETE FROM " . $index . " WHERE id = " . $record->get_record_id()); } return $this; }