packages/sql-catalog/src/Core/Sql/StatementKind.php

1<?php
2
3declare(strict_types=1);
4
5namespace SqlCatalog\Core\Sql;
6
7/**
8 * What a catalogued statement does to the database.
9 *
10 * @visibility root
11 */
12enum StatementKind: string
13{
14    case Select = 'select';
15    case Insert = 'insert';
16    case Update = 'update';
17    case Delete = 'delete';
18    case Replace = 'replace';
19    case Merge = 'merge';
20    case Truncate = 'truncate';
21    case Create = 'create';
22    case Alter = 'alter';
23    case Drop = 'drop';
24    case Call = 'call';
25    case Show = 'show';
26    case Explain = 'explain';
27    case Transaction = 'transaction';
28    case Other = 'other';
29    case Unknown = 'unknown';
30
31    /**
32     * Whether the statement can change stored rows.
33     */
34    public function isWrite(): bool
35    {
36        return match ($this) {
37            self::Insert, self::Update, self::Delete, self::Replace, self::Merge, self::Truncate => true,
38            self::Select, self::Create, self::Alter, self::Drop, self::Call, self::Show,
39            self::Explain, self::Transaction, self::Other, self::Unknown => false,
40        };
41    }
42
43    /**
44     * Whether the statement changes the schema rather than the rows.
45     */
46    public function isSchema(): bool
47    {
48        return match ($this) {
49            self::Create, self::Alter, self::Drop, self::Truncate => true,
50            self::Select, self::Insert, self::Update, self::Delete, self::Replace, self::Merge,
51            self::Call, self::Show, self::Explain, self::Transaction, self::Other, self::Unknown => false,
52        };
53    }
54}
55