diff --git a/migrations/Version20220925162725.php b/migrations/Version20220925162725.php new file mode 100644 index 00000000..14608026 --- /dev/null +++ b/migrations/Version20220925162725.php @@ -0,0 +1,126 @@ +addSql('ALTER TABLE attachments CHANGE type_id type_id INT NOT NULL'); + $this->addSql('CREATE INDEX attachments_idx_id_element_id_class_name ON attachments (id, element_id, class_name)'); + $this->addSql('CREATE INDEX attachments_idx_class_name_id ON attachments (class_name, id)'); + $this->addSql('CREATE INDEX attachment_name_idx ON attachments (name)'); + $this->addSql('CREATE INDEX attachment_element_idx ON attachments (class_name, element_id)'); + $this->addSql('ALTER TABLE categories CHANGE partname_regex partname_regex LONGTEXT NOT NULL, CHANGE partname_hint partname_hint LONGTEXT NOT NULL, CHANGE default_description default_description LONGTEXT NOT NULL, CHANGE default_comment default_comment LONGTEXT NOT NULL'); + $this->addSql('CREATE INDEX name_idx ON categories (name)'); + $this->addSql('CREATE INDEX parent_name_idx ON categories (parent_id, name)'); + $this->addSql('ALTER TABLE currencies CHANGE exchange_rate exchange_rate NUMERIC(11, 5) DEFAULT NULL COMMENT \'(DC2Type:big_decimal)\''); + $this->addSql('CREATE INDEX name_idx ON currencies (name)'); + $this->addSql('CREATE INDEX parent_name_idx ON currencies (parent_id, name)'); + $this->addSql('ALTER TABLE device_parts CHANGE mountnames mountnames LONGTEXT NOT NULL'); + $this->addSql('CREATE INDEX name_idx ON footprints (name)'); + $this->addSql('CREATE INDEX parent_name_idx ON footprints (parent_id, name)'); + $this->addSql('CREATE INDEX name_idx ON groups (name)'); + $this->addSql('CREATE INDEX parent_name_idx ON groups (parent_id, name)'); + $this->addSql('ALTER TABLE log CHANGE level level TINYINT(4) NOT NULL'); + $this->addSql('CREATE INDEX log_idx_type ON log (type)'); + $this->addSql('CREATE INDEX log_idx_type_target ON log (type, target_type, target_id)'); + $this->addSql('CREATE INDEX log_idx_datetime ON log (datetime)'); + $this->addSql('CREATE INDEX name_idx ON manufacturers (name)'); + $this->addSql('CREATE INDEX parent_name_idx ON manufacturers (parent_id, name)'); + $this->addSql('CREATE INDEX name_idx ON measurement_units (name)'); + $this->addSql('CREATE INDEX parent_name_idx ON measurement_units (parent_id, name)'); + $this->addSql('CREATE INDEX orderdetails_supplier_part_nr ON orderdetails (supplierpartnr)'); + $this->addSql('CREATE INDEX parameter_name_idx ON parameters (name)'); + $this->addSql('CREATE INDEX parameter_group_idx ON parameters (param_group)'); + $this->addSql('CREATE INDEX parameter_type_element_idx ON parameters (type, element_id)'); + $this->addSql('CREATE INDEX part_lots_idx_instock_un_expiration_id_part ON part_lots (instock_unknown, expiration_date, id_part)'); + $this->addSql('CREATE INDEX part_lots_idx_needs_refill ON part_lots (needs_refill)'); + $this->addSql('ALTER TABLE parts CHANGE description description LONGTEXT NOT NULL, CHANGE comment comment LONGTEXT NOT NULL'); + $this->addSql('CREATE INDEX parts_idx_datet_name_last_id_needs ON parts (datetime_added, name, last_modified, id, needs_review)'); + $this->addSql('CREATE INDEX parts_idx_name ON parts (name)'); + $this->addSql('ALTER TABLE pricedetails CHANGE price price NUMERIC(11, 5) NOT NULL COMMENT \'(DC2Type:big_decimal)\''); + $this->addSql('CREATE INDEX pricedetails_idx_min_discount ON pricedetails (min_discount_quantity)'); + $this->addSql('CREATE INDEX pricedetails_idx_min_discount_price_qty ON pricedetails (min_discount_quantity, price_related_quantity)'); + $this->addSql('CREATE INDEX name_idx ON storelocations (name)'); + $this->addSql('CREATE INDEX parent_name_idx ON storelocations (parent_id, name)'); + $this->addSql('ALTER TABLE suppliers CHANGE shipping_costs shipping_costs NUMERIC(11, 5) DEFAULT NULL COMMENT \'(DC2Type:big_decimal)\''); + $this->addSql('CREATE INDEX name_idx ON suppliers (name)'); + $this->addSql('CREATE INDEX parent_name_idx ON suppliers (parent_id, name)'); + $this->addSql('ALTER TABLE users CHANGE config_instock_comment_w config_instock_comment_w LONGTEXT NOT NULL, CHANGE config_instock_comment_a config_instock_comment_a LONGTEXT NOT NULL'); + $this->addSql('CREATE INDEX user_idx_username ON users (name)'); + } + + public function mySQLDown(Schema $schema): void + { + // this down() migration is auto-generated, please modify it to your needs + $this->addSql('DROP INDEX attachments_idx_id_element_id_class_name ON `attachments`'); + $this->addSql('DROP INDEX attachments_idx_class_name_id ON `attachments`'); + $this->addSql('DROP INDEX attachment_name_idx ON `attachments`'); + $this->addSql('DROP INDEX attachment_element_idx ON `attachments`'); + $this->addSql('ALTER TABLE `attachments` CHANGE type_id type_id INT DEFAULT NULL'); + $this->addSql('DROP INDEX name_idx ON `categories`'); + $this->addSql('DROP INDEX parent_name_idx ON `categories`'); + $this->addSql('ALTER TABLE `categories` CHANGE partname_hint partname_hint TEXT NOT NULL, CHANGE partname_regex partname_regex TEXT NOT NULL, CHANGE default_description default_description TEXT NOT NULL, CHANGE default_comment default_comment TEXT NOT NULL'); + $this->addSql('DROP INDEX name_idx ON currencies'); + $this->addSql('DROP INDEX parent_name_idx ON currencies'); + $this->addSql('ALTER TABLE currencies CHANGE exchange_rate exchange_rate NUMERIC(11, 5) DEFAULT NULL'); + $this->addSql('ALTER TABLE `device_parts` CHANGE mountnames mountnames MEDIUMTEXT NOT NULL'); + $this->addSql('DROP INDEX name_idx ON `footprints`'); + $this->addSql('DROP INDEX parent_name_idx ON `footprints`'); + $this->addSql('DROP INDEX name_idx ON `groups`'); + $this->addSql('DROP INDEX parent_name_idx ON `groups`'); + $this->addSql('DROP INDEX log_idx_type ON log'); + $this->addSql('DROP INDEX log_idx_type_target ON log'); + $this->addSql('DROP INDEX log_idx_datetime ON log'); + $this->addSql('ALTER TABLE log CHANGE level level TINYINT(1) NOT NULL'); + $this->addSql('DROP INDEX name_idx ON `manufacturers`'); + $this->addSql('DROP INDEX parent_name_idx ON `manufacturers`'); + $this->addSql('DROP INDEX name_idx ON `measurement_units`'); + $this->addSql('DROP INDEX parent_name_idx ON `measurement_units`'); + $this->addSql('DROP INDEX orderdetails_supplier_part_nr ON `orderdetails`'); + $this->addSql('DROP INDEX parameter_name_idx ON parameters'); + $this->addSql('DROP INDEX parameter_group_idx ON parameters'); + $this->addSql('DROP INDEX parameter_type_element_idx ON parameters'); + $this->addSql('DROP INDEX parts_idx_datet_name_last_id_needs ON `parts`'); + $this->addSql('DROP INDEX parts_idx_name ON `parts`'); + $this->addSql('ALTER TABLE `parts` CHANGE description description MEDIUMTEXT NOT NULL, CHANGE comment comment MEDIUMTEXT NOT NULL'); + $this->addSql('DROP INDEX part_lots_idx_instock_un_expiration_id_part ON part_lots'); + $this->addSql('DROP INDEX part_lots_idx_needs_refill ON part_lots'); + $this->addSql('DROP INDEX pricedetails_idx_min_discount ON `pricedetails`'); + $this->addSql('DROP INDEX pricedetails_idx_min_discount_price_qty ON `pricedetails`'); + $this->addSql('ALTER TABLE `pricedetails` CHANGE price price NUMERIC(11, 5) NOT NULL'); + $this->addSql('DROP INDEX name_idx ON `storelocations`'); + $this->addSql('DROP INDEX parent_name_idx ON `storelocations`'); + $this->addSql('DROP INDEX name_idx ON `suppliers`'); + $this->addSql('DROP INDEX parent_name_idx ON `suppliers`'); + $this->addSql('ALTER TABLE `suppliers` CHANGE shipping_costs shipping_costs NUMERIC(11, 5) DEFAULT NULL'); + $this->addSql('DROP INDEX user_idx_username ON `users`'); + $this->addSql('ALTER TABLE `users` CHANGE config_instock_comment_a config_instock_comment_a TEXT NOT NULL, CHANGE config_instock_comment_w config_instock_comment_w TEXT NOT NULL'); + } + + public function sqLiteUp(Schema $schema): void + { + + } + + public function sqLiteDown(Schema $schema): void + { + // TODO: Implement sqLiteDown() method. + } +} diff --git a/src/Entity/Attachments/Attachment.php b/src/Entity/Attachments/Attachment.php index d0dbc568..b2aaca5c 100644 --- a/src/Entity/Attachments/Attachment.php +++ b/src/Entity/Attachments/Attachment.php @@ -34,7 +34,12 @@ use LogicException; * Class Attachment. * * @ORM\Entity(repositoryClass="App\Repository\AttachmentRepository") - * @ORM\Table(name="`attachments`") + * @ORM\Table(name="`attachments`", indexes={ + * @ORM\Index(name="attachments_idx_id_element_id_class_name", columns={"id", "element_id", "class_name"}), + * @ORM\Index(name="attachments_idx_class_name_id", columns={"class_name", "id"}), + * @ORM\Index(name="attachment_name_idx", columns={"name"}), + * @ORM\Index(name="attachment_element_idx", columns={"class_name", "element_id"}) + * }) * @ORM\InheritanceType("SINGLE_TABLE") * @ORM\DiscriminatorColumn(name="class_name", type="string") * @ORM\DiscriminatorMap({ @@ -104,7 +109,7 @@ abstract class Attachment extends AbstractNamedDBElement /** * @var AttachmentType * @ORM\ManyToOne(targetEntity="AttachmentType", inversedBy="attachments_with_type") - * @ORM\JoinColumn(name="type_id", referencedColumnName="id") + * @ORM\JoinColumn(name="type_id", referencedColumnName="id", nullable=false) * @Selectable() * @Assert\NotNull(message="validator.attachment.must_not_be_null") */ diff --git a/src/Entity/LogSystem/AbstractLogEntry.php b/src/Entity/LogSystem/AbstractLogEntry.php index 54c5dcc5..a606e935 100644 --- a/src/Entity/LogSystem/AbstractLogEntry.php +++ b/src/Entity/LogSystem/AbstractLogEntry.php @@ -71,7 +71,11 @@ use Psr\Log\LogLevel; * This entity describes a entry in the event log. * * @ORM\Entity(repositoryClass="App\Repository\LogEntryRepository") - * @ORM\Table("log") + * @ORM\Table("log", indexes={ + * @ORM\Index(name="log_idx_type", columns={"type"}), + * @ORM\Index(name="log_idx_type_target", columns={"type", "target_type", "target_id"}), + * @ORM\Index(name="log_idx_datetime", columns={"datetime"}), + * }) * @ORM\InheritanceType("SINGLE_TABLE") * @ORM\DiscriminatorColumn(name="type", type="smallint") * @ORM\DiscriminatorMap({ diff --git a/src/Entity/Parameters/AbstractParameter.php b/src/Entity/Parameters/AbstractParameter.php index 2a1dc45c..35342ee0 100644 --- a/src/Entity/Parameters/AbstractParameter.php +++ b/src/Entity/Parameters/AbstractParameter.php @@ -34,7 +34,11 @@ use function sprintf; /** * @ORM\Entity(repositoryClass="App\Repository\ParameterRepository") - * @ORM\Table("parameters") + * @ORM\Table("parameters", indexes={ + * @ORM\Index(name="parameter_name_idx", columns={"name"}), + * @ORM\Index(name="parameter_group_idx", columns={"param_group"}), + * @ORM\Index(name="parameter_type_element_idx", columns={"type", "element_id"}) + * }) * @ORM\InheritanceType("SINGLE_TABLE") * @ORM\DiscriminatorColumn(name="type", type="smallint") * @ORM\DiscriminatorMap({ @@ -91,7 +95,6 @@ abstract class AbstractParameter extends AbstractNamedDBElement /** * @var string The unit in which the value values are given (e.g. V) - * @Assert\Length(max=5) * @ORM\Column(type="string", nullable=false) */ protected string $unit = ''; diff --git a/src/Entity/Parts/Category.php b/src/Entity/Parts/Category.php index 5401b7c4..5681f3fa 100644 --- a/src/Entity/Parts/Category.php +++ b/src/Entity/Parts/Category.php @@ -33,7 +33,10 @@ use Symfony\Component\Validator\Constraints as Assert; * Class AttachmentType. * * @ORM\Entity(repositoryClass="App\Repository\Parts\CategoryRepository") - * @ORM\Table(name="`categories`") + * @ORM\Table(name="`categories`", indexes={ + * @ORM\Index(name="name_idx", columns={"name"}), + * @ORM\Index(name="parent_name_idx", columns={"parent_id", "name"}), + * }) */ class Category extends AbstractPartsContainingDBElement { diff --git a/src/Entity/Parts/Footprint.php b/src/Entity/Parts/Footprint.php index 7d2bb09d..3ab83194 100644 --- a/src/Entity/Parts/Footprint.php +++ b/src/Entity/Parts/Footprint.php @@ -61,7 +61,10 @@ use Symfony\Component\Validator\Constraints as Assert; * Class Footprint. * * @ORM\Entity(repositoryClass="App\Repository\Parts\FootprintRepository") - * @ORM\Table("`footprints`") + * @ORM\Table("`footprints`", indexes={ + * @ORM\Index(name="name_idx", columns={"name"}), + * @ORM\Index(name="parent_name_idx", columns={"parent_id", "name"}), + * }) */ class Footprint extends AbstractPartsContainingDBElement { diff --git a/src/Entity/Parts/Manufacturer.php b/src/Entity/Parts/Manufacturer.php index c048f346..40ca1c3e 100644 --- a/src/Entity/Parts/Manufacturer.php +++ b/src/Entity/Parts/Manufacturer.php @@ -61,7 +61,10 @@ use Symfony\Component\Validator\Constraints as Assert; * Class Manufacturer. * * @ORM\Entity(repositoryClass="App\Repository\Parts\ManufacturerRepository") - * @ORM\Table("`manufacturers`") + * @ORM\Table("`manufacturers`", indexes={ + * @ORM\Index(name="name_idx", columns={"name"}), + * @ORM\Index(name="parent_name_idx", columns={"parent_id", "name"}), + * }) */ class Manufacturer extends AbstractCompany { diff --git a/src/Entity/Parts/MeasurementUnit.php b/src/Entity/Parts/MeasurementUnit.php index 8f8dc17a..ea938b62 100644 --- a/src/Entity/Parts/MeasurementUnit.php +++ b/src/Entity/Parts/MeasurementUnit.php @@ -55,7 +55,10 @@ use Symfony\Component\Validator\Constraints as Assert; * This could be something like N, grams, meters, etc... * * @ORM\Entity(repositoryClass="App\Repository\Parts\MeasurementUnitRepository") - * @ORM\Table(name="`measurement_units`") + * @ORM\Table(name="`measurement_units`", indexes={ + * @ORM\Index(name="name_idx", columns={"name"}), + * @ORM\Index(name="parent_name_idx", columns={"parent_id", "name"}), + * }) * @UniqueEntity("unit") */ class MeasurementUnit extends AbstractPartsContainingDBElement diff --git a/src/Entity/Parts/Part.php b/src/Entity/Parts/Part.php index bfd30ee7..00514f64 100644 --- a/src/Entity/Parts/Part.php +++ b/src/Entity/Parts/Part.php @@ -75,7 +75,10 @@ use Symfony\Component\Validator\Constraints as Assert; * Otherwise this class would be too big, to be maintained. * * @ORM\Entity(repositoryClass="App\Repository\PartRepository") - * @ORM\Table("`parts`") + * @ORM\Table("`parts`", indexes={ + * @ORM\Index(name="parts_idx_datet_name_last_id_needs", columns={"datetime_added", "name", "last_modified", "id", "needs_review"}), + * @ORM\Index(name="parts_idx_name", columns={"name"}), + * }) */ class Part extends AttachmentContainingDBElement { diff --git a/src/Entity/Parts/PartLot.php b/src/Entity/Parts/PartLot.php index 498f8e63..c548507a 100644 --- a/src/Entity/Parts/PartLot.php +++ b/src/Entity/Parts/PartLot.php @@ -58,7 +58,10 @@ use Symfony\Component\Validator\Constraints as Assert; * It is the connection between a part and its store locations. * * @ORM\Entity() - * @ORM\Table(name="part_lots") + * @ORM\Table(name="part_lots", indexes={ + * @ORM\Index(name="part_lots_idx_instock_un_expiration_id_part", columns={"instock_unknown", "expiration_date", "id_part"}), + * @ORM\Index(name="part_lots_idx_needs_refill", columns={"needs_refill"}), + * }) * @ORM\HasLifecycleCallbacks() * @ValidPartLot() */ diff --git a/src/Entity/Parts/Storelocation.php b/src/Entity/Parts/Storelocation.php index a2a34681..bb33b680 100644 --- a/src/Entity/Parts/Storelocation.php +++ b/src/Entity/Parts/Storelocation.php @@ -61,7 +61,10 @@ use Symfony\Component\Validator\Constraints as Assert; * Class Store location. * * @ORM\Entity(repositoryClass="App\Repository\Parts\StorelocationRepository") - * @ORM\Table("`storelocations`") + * @ORM\Table("`storelocations`", indexes={ + * @ORM\Index(name="name_idx", columns={"name"}), + * @ORM\Index(name="parent_name_idx", columns={"parent_id", "name"}), + * }) */ class Storelocation extends AbstractPartsContainingDBElement { diff --git a/src/Entity/Parts/Supplier.php b/src/Entity/Parts/Supplier.php index 45d7ae69..a2896d4d 100644 --- a/src/Entity/Parts/Supplier.php +++ b/src/Entity/Parts/Supplier.php @@ -65,7 +65,10 @@ use Symfony\Component\Validator\Constraints as Assert; * Class Supplier. * * @ORM\Entity(repositoryClass="App\Repository\Parts\SupplierRepository") - * @ORM\Table("`suppliers`") + * @ORM\Table("`suppliers`", indexes={ + * @ORM\Index(name="name_idx", columns={"name"}), + * @ORM\Index(name="parent_name_idx", columns={"parent_id", "name"}), + * }) */ class Supplier extends AbstractCompany { diff --git a/src/Entity/PriceInformations/Currency.php b/src/Entity/PriceInformations/Currency.php index 0ecfd39a..c8518f31 100644 --- a/src/Entity/PriceInformations/Currency.php +++ b/src/Entity/PriceInformations/Currency.php @@ -59,7 +59,10 @@ use Symfony\Component\Validator\Constraints as Assert; * * @UniqueEntity("iso_code") * @ORM\Entity() - * @ORM\Table(name="currencies") + * @ORM\Table(name="currencies", indexes={ + * @ORM\Index(name="name_idx", columns={"name"}), + * @ORM\Index(name="parent_name_idx", columns={"parent_id", "name"}), + * }) */ class Currency extends AbstractStructuralDBElement { diff --git a/src/Entity/PriceInformations/Orderdetail.php b/src/Entity/PriceInformations/Orderdetail.php index 8cf69c53..1a0a3695 100644 --- a/src/Entity/PriceInformations/Orderdetail.php +++ b/src/Entity/PriceInformations/Orderdetail.php @@ -66,7 +66,9 @@ use Symfony\Component\Validator\Constraints as Assert; /** * Class Orderdetail. * - * @ORM\Table("`orderdetails`") + * @ORM\Table("`orderdetails`", indexes={ + * @ORM\Index(name="orderdetails_supplier_part_nr", columns={"supplierpartnr"}), + * }) * @ORM\Entity() * @ORM\HasLifecycleCallbacks() * @UniqueEntity({"supplierpartnr", "supplier", "part"}) diff --git a/src/Entity/PriceInformations/Pricedetail.php b/src/Entity/PriceInformations/Pricedetail.php index 891f5add..ccaa3eba 100644 --- a/src/Entity/PriceInformations/Pricedetail.php +++ b/src/Entity/PriceInformations/Pricedetail.php @@ -66,7 +66,10 @@ use Symfony\Component\Validator\Constraints as Assert; * Class Pricedetail. * * @ORM\Entity() - * @ORM\Table("`pricedetails`") + * @ORM\Table("`pricedetails`", indexes={ + * @ORM\Index(name="pricedetails_idx_min_discount", columns={"min_discount_quantity"}), + * @ORM\Index(name="pricedetails_idx_min_discount_price_qty", columns={"min_discount_quantity", "price_related_quantity"}), + * }) * @ORM\HasLifecycleCallbacks() * @UniqueEntity(fields={"min_discount_quantity", "orderdetail"}) */ diff --git a/src/Entity/UserSystem/Group.php b/src/Entity/UserSystem/Group.php index e9cab853..348fcf8c 100644 --- a/src/Entity/UserSystem/Group.php +++ b/src/Entity/UserSystem/Group.php @@ -56,7 +56,10 @@ use Symfony\Component\Validator\Constraints as Assert; * This entity represents an user group. * * @ORM\Entity() - * @ORM\Table("`groups`") + * @ORM\Table("`groups`", indexes={ + * @ORM\Index(name="name_idx", columns={"name"}), + * @ORM\Index(name="parent_name_idx", columns={"parent_id", "name"}), + * }) */ class Group extends AbstractStructuralDBElement implements HasPermissionsInterface { diff --git a/src/Entity/UserSystem/User.php b/src/Entity/UserSystem/User.php index 918d459f..1ec48ca9 100644 --- a/src/Entity/UserSystem/User.php +++ b/src/Entity/UserSystem/User.php @@ -80,7 +80,9 @@ use Symfony\Component\Validator\Constraints as Assert; * Also this entity is able to save some informations about the user, like the names, email-address and other info. * * @ORM\Entity(repositoryClass="App\Repository\UserRepository") - * @ORM\Table("`users`") + * @ORM\Table("`users`", indexes={ + * @ORM\Index(name="user_idx_username", columns={"name"}) + * }) * @ORM\EntityListeners({"App\EntityListeners\TreeCacheInvalidationListener"}) * @UniqueEntity("name", message="validator.user.username_already_used") */