Skip to content
This repository was archived by the owner on Mar 4, 2025. It is now read-only.

Commit 0a3c4d7

Browse files
1.7
* [+] `::createInstance()` теперь создает инстанс через вызов `initConnection() + getInstance()` и сохраняет коннекшен и инстанс для дальнейшего использования. * [+] метод `::showMeta()`, возвращающий META-информацию (для последнего запроса) * [*] метод `::EmulateBuildExcerpts()` перенесен в трейт `SphinxToolkitHelper` * [+] добавлен параметр Logger к статическому и динамическому конструкторам (реализует LoggerInterface nullable)
1 parent 7499126 commit 0a3c4d7

File tree

4 files changed

+155
-108
lines changed

4 files changed

+155
-108
lines changed

interfaces/SphinxToolkitFoolzInterface.php

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ interface SphinxToolkitFoolzInterface {
2929
public static function init(string $sphinx_connection_host, string $sphinx_connection_port, $options = []);
3030

3131
/**
32-
* Создает коннекшен для множественных обновлений (в крон-скриптах, к примеру, вызывается после init() )
32+
* Создает коннекшен и устанавливает параметры подключения: хост и порт
3333
*/
3434
public static function initConnection();
3535

@@ -123,9 +123,18 @@ public static function rt_TruncateIndex(string $index_name, bool $is_reconfigure
123123
public static function rt_RebuildAbstractIndex(PDO $pdo_connection, string $sql_source_table, string $sphinx_index, Closure $make_updateset_method, string $condition = '');
124124

125125
/**
126-
* Получает инстанс (для множественных обновлений)
126+
* Создает инстанс на основе сохраненного в классе коннекшена
127127
*
128128
* @return SphinxQL
129129
*/
130130
public static function getInstance();
131+
132+
/**
133+
* Возвращает META-информацию (после запроса)
134+
*
135+
* @throws ConnectionException
136+
* @throws DatabaseException
137+
* @throws SphinxQLException
138+
*/
139+
public static function showMeta();
131140
}

interfaces/SphinxToolkitMysqliInterface.php

Lines changed: 4 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
use Closure;
66
use Exception;
77
use PDO;
8+
use Psr\Log\LoggerInterface;
89

910
/**
1011
* Interface __SphinxToolkitMysqliInterface
@@ -14,14 +15,15 @@
1415
* @package Arris\Toolkit
1516
*/
1617
interface SphinxToolkitMysqliInterface {
17-
18+
1819
/**
1920
* SphinxToolkit constructor.
2021
*
2122
* @param PDO $mysql_connection
2223
* @param PDO $sphinx_connection
24+
* @param LoggerInterface|null $logger
2325
*/
24-
public function __construct(PDO $mysql_connection, PDO $sphinx_connection);
26+
public function __construct(PDO $mysql_connection, PDO $sphinx_connection, LoggerInterface $logger = null);
2527

2628
/**
2729
* Устанавливает опции для перестроителя RT-индекса
@@ -61,19 +63,4 @@ public function rebuildAbstractIndex(string $mysql_table, string $sphinx_index,
6163
*/
6264
public function rebuildAbstractIndexMVA(string $mysql_table, string $sphinx_index, Closure $make_updateset_method, string $condition = '', array $mva_indexes_list = []):int;
6365

64-
/**
65-
* Эмулирует BuildExcerpts из SphinxAPI
66-
*
67-
* @param $source
68-
* @param $needle
69-
* @param $options
70-
* 'before_match' => '<strong>', // Строка, вставляемая перед ключевым словом. По умолчанию "<strong>".
71-
* 'after_match' => '</strong>', // Строка, вставляемая после ключевого слова. По умолчанию "</strong>".
72-
* 'chunk_separator' => '...', // Строка, вставляемая между частями фрагмента. по умолчанию "...".
73-
*
74-
* опции 'limit', 'around', 'exact_phrase' и 'single_passage' в эмуляции не реализованы
75-
*
76-
* @return mixed
77-
*/
78-
public static function EmulateBuildExcerpts($source, $needle, $options);
7966
}

src/SphinxToolkit.php

Lines changed: 90 additions & 89 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
use Foolz\SphinxQL\Exception\DatabaseException;
1616
use Foolz\SphinxQL\Helper;
1717
use Foolz\SphinxQL\SphinxQL;
18+
use Psr\Log\LoggerInterface;
1819

1920
class SphinxToolkit implements SphinxToolkitMysqliInterface, SphinxToolkitFoolzInterface
2021
{
@@ -35,16 +36,22 @@ class SphinxToolkit implements SphinxToolkitMysqliInterface, SphinxToolkitFoolzI
3536
* @var PDO
3637
*/
3738
private $sphinx_connection;
39+
40+
/**
41+
* @var LoggerInterface
42+
*/
43+
private $logger;
3844

39-
public function __construct(PDO $mysql_connection, PDO $sphinx_connection)
45+
public function __construct(PDO $mysql_connection, PDO $sphinx_connection, LoggerInterface $logger = null)
4046
{
4147
$this->mysql_connection = $mysql_connection;
4248
$this->sphinx_connection = $sphinx_connection;
49+
$this->logger = $logger;
4350
}
4451

4552
public function setRebuildIndexOptions(array $options = []):array
4653
{
47-
// на самом деле разворачиваем опции с установкой дефолтов
54+
// разворачиваем опции с установкой дефолтов
4855
$this->rai_options['chunk_length'] = SphinxToolkitHelper::setOption($options, 'chunk_length', 500);
4956

5057
$this->rai_options['log_rows_inside_chunk'] = SphinxToolkitHelper::setOption($options, 'log_rows_inside_chunk', true);
@@ -287,54 +294,14 @@ public function checkIndexExist(string $sphinx_index)
287294
return count($index_definition) > 0;
288295
}
289296

290-
291-
292-
/* =========================== СТАТИЧЕСКИЕ МЕТОДЫ ==================================== */
293-
294-
public static function EmulateBuildExcerpts($source, $needle, $options)
295-
{
296-
$opts = [
297-
// Строка, вставляемая перед ключевым словом. По умолчанию "<strong>".
298-
'before_match' => SphinxToolkitHelper::setOption($options, 'before_match', '<strong>'),
299-
300-
// Строка, вставляемая после ключевого слова. По умолчанию "</strong>".
301-
'after_match' => SphinxToolkitHelper::setOption($options, 'after_match', '</strong>'),
302-
// Строка, вставляемая между частями фрагмента. по умолчанию "...".
303-
'chunk_separator' => '...',
304-
305-
// НЕ РЕАЛИЗОВАНО: Максимальный размер фрагмента в символах. Integer, по умолчанию 256.
306-
'limit' => SphinxToolkitHelper::setOption($options, 'limit', 256),
307-
308-
// НЕ РЕАЛИЗОВАНО: Сколько слов необходимо выбрать вокруг каждого совпадающего с ключевыми словами блока. Integer, по умолчанию 5.
309-
'around' => SphinxToolkitHelper::setOption($options, 'around', 5),
310-
311-
// НЕ РЕАЛИЗОВАНО: Необходимо ли подсвечивать только точное совпадение с поисковой фразой, а не отдельные ключевые слова. Boolean, по умолчанию FALSE.
312-
'exact_phrase' => SphinxToolkitHelper::setOption($options, 'around', null),
313-
314-
// НЕ РЕАЛИЗОВАНО: Необходимо ли извлечь только единичный наиболее подходящий фрагмент. Boolean, по умолчанию FALSE.
315-
'single_passage' => SphinxToolkitHelper::setOption($options, 'single_passage', null),
316-
317-
];
318-
319-
$target = strip_tags($source);
320-
321-
$target = SphinxToolkitHelper::mb_str_replace($needle, $opts['before_match'] . $needle . $opts['after_match'], $target);
322-
323-
if (($opts['limit'] > 0) && ( mb_strlen($source) > $opts['limit'] )) {
324-
$target = SphinxToolkitHelper::mb_trim_text($target, $opts['limit'] ,true,false, $opts['chunk_separator']);
325-
}
326-
327-
return $target;
328-
} // EmulateBuildExcerpts
329-
330297
/* =========================== STATIC IMPLEMENTATION ================================= */
331298

332299
/**
333300
* rebuild_logging_options
334301
*
335302
* @var array
336303
*/
337-
private static $rlo = [];
304+
private static $spql_options = [];
338305

339306
/**
340307
* @var Connection
@@ -349,58 +316,82 @@ public static function EmulateBuildExcerpts($source, $needle, $options)
349316
* @var Connection
350317
*/
351318
private static $spql_connection;
352-
353-
public static function init(string $sphinx_connection_host, string $sphinx_connection_port, $options = [])
319+
320+
/**
321+
* @var SphinxQL
322+
*/
323+
private static $spql_instance;
324+
325+
/**
326+
* @var LoggerInterface
327+
*/
328+
private static $spql_logger;
329+
330+
/**
331+
* @inheritDoc
332+
*/
333+
public static function init(string $sphinx_connection_host, string $sphinx_connection_port, $options = [], LoggerInterface $logger = null)
354334
{
355335
self::$spql_connection_host = $sphinx_connection_host;
356336
self::$spql_connection_port = $sphinx_connection_port;
357337

358-
self::$rlo['chunk_length'] = SphinxToolkitHelper::setOption($options, 'chunk_length', 500);
338+
self::$spql_options['chunk_length'] = SphinxToolkitHelper::setOption($options, 'chunk_length', 500);
359339

360-
self::$rlo['log_rows_inside_chunk'] = SphinxToolkitHelper::setOption($options, 'log_rows_inside_chunk', true);
361-
self::$rlo['log_total_rows_found'] = SphinxToolkitHelper::setOption($options, 'log_total_rows_found', true);
340+
self::$spql_options['log_rows_inside_chunk'] = SphinxToolkitHelper::setOption($options, 'log_rows_inside_chunk', true);
341+
self::$spql_options['log_total_rows_found'] = SphinxToolkitHelper::setOption($options, 'log_total_rows_found', true);
362342

363-
self::$rlo['log_before_chunk'] = SphinxToolkitHelper::setOption($options, 'log_before_chunk', true);
364-
self::$rlo['log_after_chunk'] = SphinxToolkitHelper::setOption($options, 'log_after_chunk', true);
343+
self::$spql_options['log_before_chunk'] = SphinxToolkitHelper::setOption($options, 'log_before_chunk', true);
344+
self::$spql_options['log_after_chunk'] = SphinxToolkitHelper::setOption($options, 'log_after_chunk', true);
365345

366-
self::$rlo['sleep_after_chunk'] = SphinxToolkitHelper::setOption($options, 'sleep_after_chunk', true);
346+
self::$spql_options['sleep_after_chunk'] = SphinxToolkitHelper::setOption($options, 'sleep_after_chunk', true);
367347

368-
self::$rlo['sleep_time'] = SphinxToolkitHelper::setOption($options, 'sleep_time', 1);
369-
if (self::$rlo['sleep_time'] == 0) {
370-
self::$rlo['sleep_after_chunk'] = false;
348+
self::$spql_options['sleep_time'] = SphinxToolkitHelper::setOption($options, 'sleep_time', 1);
349+
if (self::$spql_options['sleep_time'] == 0) {
350+
self::$spql_options['sleep_after_chunk'] = false;
371351
}
372352

373-
self::$rlo['log_before_index'] = SphinxToolkitHelper::setOption($options, 'log_before_index', true);
374-
self::$rlo['log_after_index'] = SphinxToolkitHelper::setOption($options, 'log_after_index', true);
353+
self::$spql_options['log_before_index'] = SphinxToolkitHelper::setOption($options, 'log_before_index', true);
354+
self::$spql_options['log_after_index'] = SphinxToolkitHelper::setOption($options, 'log_after_index', true);
355+
356+
self::$spql_logger = $logger;
375357
}
376-
358+
359+
/**
360+
* @inheritDoc
361+
*/
377362
public static function initConnection()
378363
{
379-
$conn = new Connection();
380-
$conn->setParams([
364+
$connection = new Connection();
365+
$connection->setParams([
381366
'host' => self::$spql_connection_host,
382367
'port' => self::$spql_connection_port
383368
]);
384369

385-
self::$spql_connection = $conn;
370+
return $connection;
386371
}
387-
372+
373+
/**
374+
* @inheritDoc
375+
*/
388376
public static function getInstance()
389377
{
390378
return (new SphinxQL(self::$spql_connection));
391379
}
392-
380+
381+
/**
382+
* @inheritDoc
383+
*/
393384
public static function createInstance()
394385
{
395-
$conn = new Connection();
396-
$conn->setParams([
397-
'host' => self::$spql_connection_host,
398-
'port' => self::$spql_connection_port
399-
]);
400-
401-
return (new SphinxQL($conn));
386+
self::$spql_connection = self::initConnection();
387+
self::$spql_instance = self::getInstance();
388+
389+
return self::$spql_instance;
402390
}
403-
391+
392+
/**
393+
* @inheritDoc
394+
*/
404395
public static function rt_ReplaceIndex(string $index_name, array $updateset)
405396
{
406397
if (empty($updateset)) return null;
@@ -411,7 +402,10 @@ public static function rt_ReplaceIndex(string $index_name, array $updateset)
411402
->set($updateset)
412403
->execute();
413404
}
414-
405+
406+
/**
407+
* @inheritDoc
408+
*/
415409
public static function rt_UpdateIndex(string $index_name, array $updateset)
416410
{
417411
if (empty($updateset)) return null;
@@ -422,7 +416,10 @@ public static function rt_UpdateIndex(string $index_name, array $updateset)
422416
->set($updateset)
423417
->execute();
424418
}
425-
419+
420+
/**
421+
* @inheritDoc
422+
*/
426423
public static function rt_DeleteIndex(string $index_name, string $field, $field_value = null)
427424
{
428425
if (is_null($field_value)) return null;
@@ -449,11 +446,7 @@ public static function rt_DeleteIndexMatch(string $index_name, string $field, $f
449446
}
450447

451448
/**
452-
* Делает truncate index с реконфигурацией по умолчанию
453-
*
454-
* @param string $index_name
455-
* @param bool $is_reconfigure
456-
* @return bool
449+
* @inheritDoc
457450
*/
458451
public static function rt_TruncateIndex(string $index_name, bool $is_reconfigure = true)
459452
{
@@ -462,10 +455,13 @@ public static function rt_TruncateIndex(string $index_name, bool $is_reconfigure
462455

463456
return (bool)self::createInstance()->query("TRUNCATE RTINDEX {$index_name} {$with}");
464457
}
465-
458+
459+
/**
460+
* @inheritDoc
461+
*/
466462
public static function rt_RebuildAbstractIndex(PDO $pdo_connection, string $sql_source_table, string $sphinx_index, Closure $make_updateset_method, string $condition = '')
467463
{
468-
$chunk_size = self::$rlo['chunk_length'];
464+
$chunk_size = self::$spql_options['chunk_length'];
469465

470466
self::rt_TruncateIndex($sphinx_index);
471467

@@ -475,17 +471,17 @@ public static function rt_RebuildAbstractIndex(PDO $pdo_connection, string $sql_
475471
->fetchColumn();
476472
$total_updated = 0;
477473

478-
if (self::$rlo['log_before_index'])
474+
if (self::$spql_options['log_before_index'])
479475
CLIConsole::say("<font color='yellow'>[{$sphinx_index}]</font> index : ", false);
480476

481-
if (self::$rlo['log_total_rows_found'])
477+
if (self::$spql_options['log_total_rows_found'])
482478
CLIConsole::say("<font color='green'>{$total_count}</font> elements found for rebuild.");
483479

484480
// iterate chunks
485481
for ($i = 0; $i < ceil($total_count / $chunk_size); $i++) {
486482
$offset = $i * $chunk_size;
487483

488-
if (self::$rlo['log_before_chunk']) CLIConsole::say("Rebuilding elements from <font color='green'>{$offset}</font>, <font color='yellow'>{$chunk_size}</font> count... " , false);
484+
if (self::$spql_options['log_before_chunk']) CLIConsole::say("Rebuilding elements from <font color='green'>{$offset}</font>, <font color='yellow'>{$chunk_size}</font> count... " , false);
489485

490486
$query_chunk_data = "SELECT * FROM {$sql_source_table} ";
491487
$query_chunk_data.= $condition != '' ? " WHERE {$condition} " : ' ';
@@ -495,7 +491,7 @@ public static function rt_RebuildAbstractIndex(PDO $pdo_connection, string $sql_
495491

496492
// iterate inside chunk
497493
while ($item = $sth->fetch()) {
498-
if (self::$rlo['log_rows_inside_chunk'])
494+
if (self::$spql_options['log_rows_inside_chunk'])
499495
CLIConsole::say("{$sql_source_table}: {$item['id']}");
500496

501497
$update_set = $make_updateset_method($item);
@@ -505,25 +501,30 @@ public static function rt_RebuildAbstractIndex(PDO $pdo_connection, string $sql_
505501
$total_updated++;
506502
} // while
507503

508-
$breakline_after_chunk = !self::$rlo['sleep_after_chunk'];
504+
$breakline_after_chunk = !self::$spql_options['sleep_after_chunk'];
509505

510-
if (self::$rlo['log_after_chunk']) {
506+
if (self::$spql_options['log_after_chunk']) {
511507
CLIConsole::say("Updated RT-index <font color='yellow'>{$sphinx_index}</font>.", $breakline_after_chunk);
512508
} else {
513509
CLIConsole::say("<strong>Ok</strong>", $breakline_after_chunk);
514510
}
515511

516-
if (self::$rlo['sleep_after_chunk']) {
517-
CLIConsole::say(" ZZZZzzz for " . self::$rlo['sleep_time'] . " second(s)... ", FALSE);
518-
sleep(self::$rlo['sleep_time']);
512+
if (self::$spql_options['sleep_after_chunk']) {
513+
CLIConsole::say(" ZZZZzzz for " . self::$spql_options['sleep_time'] . " second(s)... ", FALSE);
514+
sleep(self::$spql_options['sleep_time']);
519515
CLIConsole::say("I woke up!");
520516
}
521517
} // for
522-
if (self::$rlo['log_after_index'])
518+
if (self::$spql_options['log_after_index'])
523519
CLIConsole::say("Total updated <strong>{$total_updated}</strong> elements for <font color='yellow'>{$sphinx_index}</font> RT-index. <br>");
524520

525521
return $total_updated;
526522
}
523+
524+
public static function showMeta()
525+
{
526+
(new Helper(self::$spql_connection))->showMeta()->execute()->fetchAllAssoc();
527+
}
527528

528529
/**
529530
*

0 commit comments

Comments
 (0)