HEX
Server: LiteSpeed
System: Linux s1049.use1.mysecurecloudhost.com 4.18.0-477.27.2.lve.el8.x86_64 #1 SMP Wed Oct 11 12:32:56 UTC 2023 x86_64
User: xedaptot (3356)
PHP: 8.3.31
Disabled: NONE
Upload Files
File: /home/xedaptot/iphim.naniguide.com/common/Search/Drivers/Mysql/MysqlFullTextIndexer.php
<?php

namespace Common\Search\Drivers\Mysql;

use Illuminate\Support\Facades\DB;

class MysqlFullTextIndexer
{
    private string $tableName;

    private string $indexName;

    private array $searchableFields;

    private bool $indexAlreadyExists;

    public function createOrUpdateIndex(string $model): void
    {
        $model = new $model();
        $this->tableName =
            config('database.connections.mysql.prefix') . $model->getTable();
        $this->indexName = $model->searchableAs();

        $this->searchableFields = $model->getSearchableKeys(true);

        $this->indexAlreadyExists = $this->indexExists();

        if (!$this->indexAlreadyExists || $this->indexNeedsUpdate()) {
            $this->dropIndex();
            $fields = implode(',', $this->searchableFields);
            DB::statement(
                "CREATE FULLTEXT INDEX $this->indexName ON $this->tableName ($fields)",
            );
        }
    }

    private function indexExists(): bool
    {
        return !empty(
            DB::select("SHOW INDEX FROM $this->tableName WHERE Key_name = ?", [
                $this->indexName,
            ])
        );
    }

    private function indexNeedsUpdate(): bool
    {
        $currentIndexFields = $this->searchableFields;
        $expectedIndexFields = $this->getIndexFields();

        return $currentIndexFields != $expectedIndexFields;
    }

    private function getIndexFields(): array
    {
        $index = DB::select(
            "SHOW INDEX FROM $this->tableName WHERE Key_name = ?",
            [$this->indexName],
        );

        $indexFields = [];

        foreach ($index as $idx) {
            $indexFields[] = $idx->Column_name;
        }

        return $indexFields;
    }

    private function dropIndex()
    {
        if ($this->indexAlreadyExists) {
            DB::statement(
                "ALTER TABLE $this->tableName DROP INDEX $this->indexName",
            );
        }
    }
}