|
|
|
@@ -5,6 +5,7 @@ namespace App\Database\Migrations;
|
|
|
|
|
use CodeIgniter\Database\Migration;
|
|
|
|
|
use CodeIgniter\Database\ResultInterface;
|
|
|
|
|
use App\Models\Attribute;
|
|
|
|
|
use Config\Database;
|
|
|
|
|
use Config\OSPOS;
|
|
|
|
|
use DateTime;
|
|
|
|
|
|
|
|
|
@@ -45,46 +46,64 @@ class Migration_database_optimizations extends Migration
|
|
|
|
|
$builder = $this->db->table('attribute_values');
|
|
|
|
|
$builder->delete(['attribute_id' => $attribute_value['attribute_id']]);
|
|
|
|
|
|
|
|
|
|
//TODO: This should be converted to using CI4 QueryBuilder
|
|
|
|
|
$query = 'SELECT links.definition_id, links.item_id, links.attribute_id, defs.definition_type'
|
|
|
|
|
. ' FROM ospos_attribute_links links'
|
|
|
|
|
. ' JOIN ospos_attribute_definitions defs ON defs.definition_id = links.definition_id'
|
|
|
|
|
. ' WHERE attribute_id = ' . $attribute_value['attribute_id'];
|
|
|
|
|
$attribute_links = $this->db->query($query);
|
|
|
|
|
|
|
|
|
|
$builder = $this->db->table('attribute_links');
|
|
|
|
|
$builder->select('links.definition_id, links.item_id, links.attribute_id, defs.definition_type');
|
|
|
|
|
$builder->join('attribute_definitions defs', 'defs.definition_id = links.definition_id');
|
|
|
|
|
$builder->where('attribute_id', $attribute_value['attribute_id']);
|
|
|
|
|
$attribute_links = $builder->get();
|
|
|
|
|
|
|
|
|
|
foreach($attribute_links->getResultArray() as $attribute_link)
|
|
|
|
|
if($attribute_links)
|
|
|
|
|
{
|
|
|
|
|
$builder->where('attribute_id', $attribute_link['attribute_id']);
|
|
|
|
|
$builder->where('item_id', $attribute_link['item_id']);
|
|
|
|
|
$builder->delete();
|
|
|
|
|
$builder = $this->db->table('attribute_links');
|
|
|
|
|
|
|
|
|
|
switch($attribute_link['definition_type'])
|
|
|
|
|
foreach($attribute_links->getResultArray() as $attribute_link)
|
|
|
|
|
{
|
|
|
|
|
case DECIMAL:
|
|
|
|
|
$value = $attribute_value['attribute_decimal'];
|
|
|
|
|
break;
|
|
|
|
|
case DATE:
|
|
|
|
|
$config = config(OSPOS::class)->settings;
|
|
|
|
|
$attribute_date = DateTime::createFromFormat('Y-m-d', $attribute_value['attribute_date']);
|
|
|
|
|
$value = $attribute_date->format($config['dateformat']);
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
$value = $attribute_value['attribute_value'];
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
$builder->where('attribute_id', $attribute_link['attribute_id']);
|
|
|
|
|
$builder->where('item_id', $attribute_link['item_id']);
|
|
|
|
|
$builder->delete();
|
|
|
|
|
|
|
|
|
|
$attribute->save_value($value, $attribute_link['definition_id'], $attribute_link['item_id'], false, $attribute_link['definition_type']);
|
|
|
|
|
switch($attribute_link['definition_type'])
|
|
|
|
|
{
|
|
|
|
|
case DECIMAL:
|
|
|
|
|
$value = $attribute_value['attribute_decimal'];
|
|
|
|
|
break;
|
|
|
|
|
case DATE:
|
|
|
|
|
$config = config(OSPOS::class)->settings;
|
|
|
|
|
$attribute_date = DateTime::createFromFormat('Y-m-d', $attribute_value['attribute_date']);
|
|
|
|
|
$value = $attribute_date->format($config['dateformat']);
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
$value = $attribute_value['attribute_value'];
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$attribute->save_value($value, $attribute_link['definition_id'], $attribute_link['item_id'], false, $attribute_link['definition_type']);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
$this->db->transComplete();
|
|
|
|
|
|
|
|
|
|
$this->delete_index('customers', 'person_id');
|
|
|
|
|
$this->delete_index('employees', 'person_id');
|
|
|
|
|
$this->delete_index('suppliers', 'person_id');
|
|
|
|
|
|
|
|
|
|
helper('migration');
|
|
|
|
|
execute_script(APPPATH . 'Database/Migrations/sqlscripts/3.4.0_database_optimizations.sql');
|
|
|
|
|
error_log('Migrating database_optimizations completed');
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private function delete_index(string $table, string $index): void
|
|
|
|
|
{
|
|
|
|
|
$result = $this->db->query('SELECT COUNT(*) FROM information_schema.statistics WHERE table_schema = DATABASE() AND table_name = \'' . $this->db->getPrefix() . "$table' AND index_name = '$index'");
|
|
|
|
|
$index_exists = $result->getRowArray()['COUNT(*)'] > 0;
|
|
|
|
|
|
|
|
|
|
if($index_exists)
|
|
|
|
|
{
|
|
|
|
|
$forge = Database::forge();
|
|
|
|
|
$forge->dropKey($table, $index, false);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Given the type of attribute, deletes any duplicates it finds in the attribute_values table and reassigns those
|
|
|
|
|
*/
|
|
|
|
@@ -96,15 +115,22 @@ class Migration_database_optimizations extends Migration
|
|
|
|
|
$column = 'attribute_' . strtolower($attribute_type);
|
|
|
|
|
|
|
|
|
|
$builder = $this->db->table('attribute_values');
|
|
|
|
|
$builder->select("$column, attribute_id");
|
|
|
|
|
$builder->select("$column");
|
|
|
|
|
$builder->groupBy($column);
|
|
|
|
|
$builder->having("COUNT($column) > 1");
|
|
|
|
|
$duplicated_values = $builder->get();
|
|
|
|
|
|
|
|
|
|
foreach($duplicated_values->getResultArray() as $duplicated_value)
|
|
|
|
|
{
|
|
|
|
|
$subquery_builder = $this->db->table('attribute_values');
|
|
|
|
|
$subquery_builder->select('attribute_id');
|
|
|
|
|
$subquery_builder->where($column, $duplicated_value[$column]);
|
|
|
|
|
$subquery = $subquery_builder->getCompiledSelect();
|
|
|
|
|
|
|
|
|
|
$builder = $this->db->table('attribute_values');
|
|
|
|
|
$builder->select('attribute_id');
|
|
|
|
|
$builder->where($column, $duplicated_value[$column]);
|
|
|
|
|
$builder->where("attribute_id IN ($subquery)", null, false);
|
|
|
|
|
$attribute_ids_to_fix = $builder->get();
|
|
|
|
|
|
|
|
|
|
$this->reassign_duplicate_attribute_values($attribute_ids_to_fix, $duplicated_value);
|
|
|
|
@@ -121,15 +147,18 @@ class Migration_database_optimizations extends Migration
|
|
|
|
|
*/
|
|
|
|
|
private function reassign_duplicate_attribute_values(ResultInterface $attribute_ids_to_fix, array $attribute_value): void
|
|
|
|
|
{
|
|
|
|
|
foreach($attribute_ids_to_fix->getResultArray() as $attribute_id)
|
|
|
|
|
$attribute_ids = $attribute_ids_to_fix->getResultArray();
|
|
|
|
|
$retain_attribute_id = $attribute_ids[0]['attribute_id'];
|
|
|
|
|
|
|
|
|
|
foreach($attribute_ids as $attribute_id)
|
|
|
|
|
{
|
|
|
|
|
//Update attribute_link with the attribute_id we are keeping
|
|
|
|
|
$builder = $this->db->table('attribute_links');
|
|
|
|
|
$builder->where('attribute_id', $attribute_id['attribute_id']);
|
|
|
|
|
$builder->update(['attribute_id' => $attribute_value['attribute_id']]);
|
|
|
|
|
$builder->update(['attribute_id' => $retain_attribute_id]);
|
|
|
|
|
|
|
|
|
|
//Delete the row from attribute_values if it isn't our keeper
|
|
|
|
|
if($attribute_id['attribute_id'] !== $attribute_value['attribute_id'])
|
|
|
|
|
if($attribute_id['attribute_id'] !== $retain_attribute_id)
|
|
|
|
|
{
|
|
|
|
|
$builder = $this->db->table('attribute_values');
|
|
|
|
|
$builder->delete(['attribute_id' => $attribute_id['attribute_id']]);
|
|
|
|
|