Passed
Push — main ( d905f5...0835f2 )
by Jacobo
03:45
created

anonymous//database/migrations/2025_01_01_000004_add_multitenant_indexes.php$0   A

Complexity

Total Complexity 2

Size/Duplication

Total Lines 23
Duplicated Lines 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
wmc 2
eloc 9
c 1
b 0
f 0
dl 0
loc 23
rs 10

2 Methods

Rating   Name   Duplication   Size   Complexity  
A 2025_01_01_000004_add_multitenant_indexes.php$0 ➔ up() 0 13 1
A 2025_01_01_000004_add_multitenant_indexes.php$0 ➔ down() 0 6 1
1
<?php
2
3
declare(strict_types=1);
4
5
use Illuminate\Database\Migrations\Migration;
6
use Illuminate\Database\Schema\Blueprint;
7
use Illuminate\Support\Facades\Schema;
8
9
/**
10
 * Add optimized indexes for multi-tenant queries.
11
 * 
12
 * In a multi-client context where each issuer_tax_id is a different client,
13
 * these are the most frequent queries:
14
 * 
15
 * 1. Get invoices from a client: WHERE issuer_tax_id = ?
16
 * 2. Get pending invoices from a client: WHERE issuer_tax_id = ? AND status = ?
17
 * 3. Get invoices by date range from a client: WHERE issuer_tax_id = ? AND date BETWEEN ? AND ?
18
 * 4. Search for rectified invoice: WHERE issuer_tax_id = ? AND number = ?
19
 * 
20
 * Composite indexes significantly improve the performance of these queries.
21
 */
22
return new class extends Migration {
23
    public function up(): void
24
    {
25
        Schema::table('invoices', function (Blueprint $table) {
26
            // Index for queries by issuer (client)
27
            $table->index('issuer_tax_id', 'invoices_issuer_tax_id_index');
28
            
29
            // Composite index for "invoices from a client with status X"
30
            // Very used in: dashboards, reports, retries
31
            $table->index(['issuer_tax_id', 'date'], 'invoices_issuer_date_index');
32
            
33
            // Index for chaining search (previous invoice)
34
            // Chaining must search only invoices from the same issuer
35
            $table->index(['issuer_tax_id', 'previous_invoice_number'], 'invoices_issuer_prev_number_index');
36
        });
37
    }
38
39
    public function down(): void
40
    {
41
        Schema::table('invoices', function (Blueprint $table) {
42
            $table->dropIndex('invoices_issuer_tax_id_index');
43
            $table->dropIndex('invoices_issuer_date_index');
44
            $table->dropIndex('invoices_issuer_prev_number_index');
45
        });
46
    }
47
};
48