Skip to content

Commit 503cfb6

Browse files
akoclaude
andcommitted
refactor: remove STORE syntax, use ALTER ENTITY ADD/DROP ATTRIBUTE for system attributes
System attributes now use the same ADD ATTRIBUTE / DROP ATTRIBUTE syntax as regular attributes with pseudo-types: ALTER ENTITY Module.Entity ADD ATTRIBUTE Owner: AutoOwner; ALTER ENTITY Module.Entity DROP ATTRIBUTE Owner; Removed SET/DROP STORE grammar rules, AST operations, visitor handlers, and executor handlers. The STORE keyword is no longer used for entities. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent fd26b9d commit 503cfb6

File tree

13 files changed

+6736
-7175
lines changed

13 files changed

+6736
-7175
lines changed

.claude/skills/mendix/generate-domain-model.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -222,12 +222,12 @@ CREATE PERSISTENT ENTITY Sales.Order (
222222
);
223223
```
224224

225-
To enable/disable on existing entities, use ALTER ENTITY:
225+
To enable/disable on existing entities, use ALTER ENTITY ADD/DROP ATTRIBUTE:
226226

227227
```sql
228-
ALTER ENTITY Sales.Order SET STORE OWNER;
229-
ALTER ENTITY Sales.Order SET STORE CHANGED DATE;
230-
ALTER ENTITY Sales.Order DROP STORE CHANGED BY;
228+
ALTER ENTITY Sales.Order ADD ATTRIBUTE Owner: AutoOwner;
229+
ALTER ENTITY Sales.Order ADD ATTRIBUTE ChangedDate: AutoChangedDate;
230+
ALTER ENTITY Sales.Order DROP ATTRIBUTE ChangedBy;
231231
```
232232

233233
**When to use auditing:**

cmd/mxcli/help_topics/entity.txt

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -56,11 +56,9 @@ System Attributes (auditing):
5656
ChangedDate: AutoChangedDate
5757
);
5858

59-
Use ALTER ENTITY to toggle on existing entities:
60-
ALTER ENTITY MyModule.Entity SET STORE OWNER;
61-
ALTER ENTITY MyModule.Entity DROP STORE CHANGED DATE;
62-
63-
To toggle on existing entities, use ALTER ENTITY SET/DROP STORE.
59+
Add/drop on existing entities with ALTER ENTITY:
60+
ALTER ENTITY MyModule.Entity ADD ATTRIBUTE Owner: AutoOwner;
61+
ALTER ENTITY MyModule.Entity DROP ATTRIBUTE ChangedDate;
6462

6563
Complete Example:
6664
CREATE PERSISTENT ENTITY MyModule.Customer (

docs-site/src/language/alter-entity.md

Lines changed: 11 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -89,26 +89,20 @@ ALTER ENTITY Sales.Customer
8989
SET DOCUMENTATION 'Customer master data for the Sales module';
9090
```
9191

92-
## SET/DROP STORE (System Attributes)
92+
## ADD/DROP System Attributes
9393

94-
Enable or disable auditing system attributes:
94+
System attributes use the same ADD/DROP syntax as regular attributes:
9595

9696
```sql
97-
-- Enable owner tracking (adds System.owner association)
98-
ALTER ENTITY Sales.Order SET STORE OWNER;
99-
100-
-- Enable changed-by tracking (adds System.changedBy association)
101-
ALTER ENTITY Sales.Order SET STORE CHANGED BY;
102-
103-
-- Enable created-date tracking (adds CreatedDate: DateTime)
104-
ALTER ENTITY Sales.Order SET STORE CREATED DATE;
105-
106-
-- Enable changed-date tracking (adds ChangedDate: DateTime)
107-
ALTER ENTITY Sales.Order SET STORE CHANGED DATE;
108-
109-
-- Disable any of the above
110-
ALTER ENTITY Sales.Order DROP STORE OWNER;
111-
ALTER ENTITY Sales.Order DROP STORE CHANGED DATE;
97+
-- Add system attributes
98+
ALTER ENTITY Sales.Order ADD ATTRIBUTE Owner: AutoOwner;
99+
ALTER ENTITY Sales.Order ADD ATTRIBUTE ChangedBy: AutoChangedBy;
100+
ALTER ENTITY Sales.Order ADD ATTRIBUTE CreatedDate: AutoCreatedDate;
101+
ALTER ENTITY Sales.Order ADD ATTRIBUTE ChangedDate: AutoChangedDate;
102+
103+
-- Drop system attributes (by name)
104+
ALTER ENTITY Sales.Order DROP ATTRIBUTE Owner;
105+
ALTER ENTITY Sales.Order DROP ATTRIBUTE ChangedDate;
112106
```
113107

114108
## ADD/DROP EVENT HANDLER
@@ -169,11 +163,6 @@ ALTER ENTITY <Module>.<Entity>
169163
ALTER ENTITY <Module>.<Entity>
170164
SET POSITION (<x>, <y>)
171165

172-
ALTER ENTITY <Module>.<Entity>
173-
SET STORE OWNER|CHANGED BY|CREATED DATE|CHANGED DATE
174-
175-
ALTER ENTITY <Module>.<Entity>
176-
DROP STORE OWNER|CHANGED BY|CREATED DATE|CHANGED DATE
177166
```
178167

179168
## See Also

docs-site/src/language/entities.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -120,8 +120,8 @@ CREATE PERSISTENT ENTITY Sales.Order (
120120
Toggle on existing entities with ALTER ENTITY:
121121

122122
```sql
123-
ALTER ENTITY Sales.Order SET STORE OWNER;
124-
ALTER ENTITY Sales.Order DROP STORE CHANGED DATE;
123+
ALTER ENTITY Sales.Order ADD ATTRIBUTE Owner: AutoOwner;
124+
ALTER ENTITY Sales.Order DROP ATTRIBUTE ChangedDate;
125125
```
126126

127127
## Annotations

docs/01-project/MDL_QUICK_REFERENCE.md

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -68,11 +68,8 @@ Modifies an existing entity without full replacement.
6868
| Drop event handler | `ALTER ENTITY Module.Name DROP EVENT HANDLER ON BEFORE COMMIT;` | |
6969
| Set documentation | `ALTER ENTITY Module.Name SET DOCUMENTATION 'text';` | |
7070
| Set position | `ALTER ENTITY Module.Name SET POSITION (100, 200);` | Canvas position |
71-
| Enable owner tracking | `ALTER ENTITY Module.Name SET STORE OWNER;` | Adds System.owner association |
72-
| Enable changed-by tracking | `ALTER ENTITY Module.Name SET STORE CHANGED BY;` | Adds System.changedBy association |
73-
| Enable created-date tracking | `ALTER ENTITY Module.Name SET STORE CREATED DATE;` | Adds CreatedDate attribute |
74-
| Enable changed-date tracking | `ALTER ENTITY Module.Name SET STORE CHANGED DATE;` | Adds ChangedDate attribute |
75-
| Disable any of the above | `ALTER ENTITY Module.Name DROP STORE OWNER\|CHANGED BY\|CREATED DATE\|CHANGED DATE;` | |
71+
| Add system attribute | `ALTER ENTITY Module.Name ADD ATTRIBUTE Owner: AutoOwner;` | Same syntax as regular attributes |
72+
| Drop system attribute | `ALTER ENTITY Module.Name DROP ATTRIBUTE Owner;` | Drop by system attribute name |
7673

7774
**Example:**
7875
```sql

mdl-examples/doctype-tests/16-xpath-examples.mdl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ CREATE PERSISTENT ENTITY XpathTest.Order (
3838
);
3939

4040
-- Enable System.owner so XPath can reference it
41-
ALTER ENTITY XpathTest.Order SET STORE OWNER;
41+
ALTER ENTITY XpathTest.Order ADD ATTRIBUTE Owner: AutoOwner;
4242

4343
CREATE PERSISTENT ENTITY XpathTest.OrderLine (
4444
Quantity: Integer,

mdl-examples/doctype-tests/26-system-attribute-examples.mdl

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
-- AutoChangedDate -> ChangedDate: DateTime (auto-set on commit)
1212
--
1313
-- This file demonstrates enabling these both during CREATE ENTITY
14-
-- (as pseudo-typed attributes) and via ALTER ENTITY (SET / DROP STORE).
14+
-- (as pseudo-typed attributes) and via ALTER ENTITY ADD/DROP ATTRIBUTE.
1515
--
1616
-- ============================================================================
1717

@@ -52,10 +52,10 @@ CREATE OR MODIFY PERSISTENT ENTITY SysAttrTest.Customer (
5252
Email: String(200)
5353
);
5454

55-
ALTER ENTITY SysAttrTest.Customer SET STORE OWNER;
56-
ALTER ENTITY SysAttrTest.Customer SET STORE CHANGED BY;
57-
ALTER ENTITY SysAttrTest.Customer SET STORE CREATED DATE;
58-
ALTER ENTITY SysAttrTest.Customer SET STORE CHANGED DATE;
55+
ALTER ENTITY SysAttrTest.Customer ADD ATTRIBUTE Owner: AutoOwner;
56+
ALTER ENTITY SysAttrTest.Customer ADD ATTRIBUTE ChangedBy: AutoChangedBy;
57+
ALTER ENTITY SysAttrTest.Customer ADD ATTRIBUTE CreatedDate: AutoCreatedDate;
58+
ALTER ENTITY SysAttrTest.Customer ADD ATTRIBUTE ChangedDate: AutoChangedDate;
5959

6060
-- ============================================================================
6161
-- Example 4: ALTER ENTITY to disable previously enabled flags
@@ -67,9 +67,9 @@ CREATE OR MODIFY PERSISTENT ENTITY SysAttrTest.TempRecord (
6767
CreatedDate: AutoCreatedDate
6868
);
6969

70-
-- Disable both flags
71-
ALTER ENTITY SysAttrTest.TempRecord DROP STORE OWNER;
72-
ALTER ENTITY SysAttrTest.TempRecord DROP STORE CREATED DATE;
70+
-- Disable both flags (drop by system attribute name)
71+
ALTER ENTITY SysAttrTest.TempRecord DROP ATTRIBUTE Owner;
72+
ALTER ENTITY SysAttrTest.TempRecord DROP ATTRIBUTE CreatedDate;
7373

7474
-- ============================================================================
7575
-- Example 5: Entity with event handlers

mdl/ast/ast_entity.go

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -66,15 +66,7 @@ const (
6666
AlterEntitySetComment // SET COMMENT
6767
AlterEntityAddIndex // ADD INDEX
6868
AlterEntityDropIndex // DROP INDEX
69-
AlterEntitySetStoreOwner // SET STORE OWNER
70-
AlterEntitySetStoreChangedBy // SET STORE CHANGED BY
71-
AlterEntitySetStoreCreatedDate // SET STORE CREATED DATE
72-
AlterEntitySetStoreChangedDate // SET STORE CHANGED DATE
73-
AlterEntityDropStoreOwner // DROP STORE OWNER
74-
AlterEntityDropStoreChangedBy // DROP STORE CHANGED BY
75-
AlterEntityDropStoreCreatedDate // DROP STORE CREATED DATE
76-
AlterEntityDropStoreChangedDate // DROP STORE CHANGED DATE
77-
AlterEntitySetPosition // SET POSITION (x, y)
69+
AlterEntitySetPosition // SET POSITION (x, y)
7870
AlterEntityAddEventHandler // ADD EVENT HANDLER ON BEFORE/AFTER CREATE/COMMIT/DELETE/ROLLBACK CALL Mod.MF
7971
AlterEntityDropEventHandler // DROP EVENT HANDLER ON BEFORE/AFTER CREATE/COMMIT/DELETE/ROLLBACK
8072
)

mdl/executor/cmd_entities.go

Lines changed: 39 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -495,6 +495,21 @@ func (e *Executor) execAlterEntity(s *ast.AlterEntityStmt) error {
495495
if a == nil {
496496
return fmt.Errorf("no attribute definition provided")
497497
}
498+
// Pseudo-types: set entity flags instead of adding real attributes
499+
switch a.Type.Kind {
500+
case ast.TypeAutoOwner:
501+
entity.HasOwner = true
502+
return e.writer.UpdateEntity(dm.ID, entity)
503+
case ast.TypeAutoChangedBy:
504+
entity.HasChangedBy = true
505+
return e.writer.UpdateEntity(dm.ID, entity)
506+
case ast.TypeAutoCreatedDate:
507+
entity.HasCreatedDate = true
508+
return e.writer.UpdateEntity(dm.ID, entity)
509+
case ast.TypeAutoChangedDate:
510+
entity.HasChangedDate = true
511+
return e.writer.UpdateEntity(dm.ID, entity)
512+
}
498513
// CALCULATED attributes are only supported on persistent entities
499514
if a.Calculated && !entity.Persistable {
500515
return fmt.Errorf("attribute '%s': CALCULATED attributes are only supported on persistent entities", a.Name)
@@ -639,6 +654,30 @@ func (e *Executor) execAlterEntity(s *ast.AlterEntityStmt) error {
639654
fmt.Fprintf(e.output, "Modified attribute '%s' on entity %s\n", s.AttributeName, s.Name)
640655

641656
case ast.AlterEntityDropAttribute:
657+
// System attribute pseudo-names: drop by clearing entity flags
658+
switch strings.ToLower(s.AttributeName) {
659+
case "owner":
660+
if entity.HasOwner {
661+
entity.HasOwner = false
662+
return e.writer.UpdateEntity(dm.ID, entity)
663+
}
664+
case "changedby":
665+
if entity.HasChangedBy {
666+
entity.HasChangedBy = false
667+
return e.writer.UpdateEntity(dm.ID, entity)
668+
}
669+
case "createddate":
670+
if entity.HasCreatedDate {
671+
entity.HasCreatedDate = false
672+
return e.writer.UpdateEntity(dm.ID, entity)
673+
}
674+
case "changeddate":
675+
if entity.HasChangedDate {
676+
entity.HasChangedDate = false
677+
return e.writer.UpdateEntity(dm.ID, entity)
678+
}
679+
}
680+
642681
idx := -1
643682
for i, attr := range entity.Attributes {
644683
if attr.Name == s.AttributeName {
@@ -746,70 +785,6 @@ func (e *Executor) execAlterEntity(s *ast.AlterEntityStmt) error {
746785
e.invalidateDomainModelsCache()
747786
fmt.Fprintf(e.output, "Set comment on entity %s\n", s.Name)
748787

749-
case ast.AlterEntitySetStoreOwner:
750-
entity.HasOwner = true
751-
if err := e.writer.UpdateEntity(dm.ID, entity); err != nil {
752-
return fmt.Errorf("failed to set store owner: %w", err)
753-
}
754-
e.invalidateDomainModelsCache()
755-
fmt.Fprintf(e.output, "Enabled store owner on entity %s\n", s.Name)
756-
757-
case ast.AlterEntitySetStoreChangedBy:
758-
entity.HasChangedBy = true
759-
if err := e.writer.UpdateEntity(dm.ID, entity); err != nil {
760-
return fmt.Errorf("failed to set store changed by: %w", err)
761-
}
762-
e.invalidateDomainModelsCache()
763-
fmt.Fprintf(e.output, "Enabled store changed by on entity %s\n", s.Name)
764-
765-
case ast.AlterEntitySetStoreCreatedDate:
766-
entity.HasCreatedDate = true
767-
if err := e.writer.UpdateEntity(dm.ID, entity); err != nil {
768-
return fmt.Errorf("failed to set store created date: %w", err)
769-
}
770-
e.invalidateDomainModelsCache()
771-
fmt.Fprintf(e.output, "Enabled store created date on entity %s\n", s.Name)
772-
773-
case ast.AlterEntitySetStoreChangedDate:
774-
entity.HasChangedDate = true
775-
if err := e.writer.UpdateEntity(dm.ID, entity); err != nil {
776-
return fmt.Errorf("failed to set store changed date: %w", err)
777-
}
778-
e.invalidateDomainModelsCache()
779-
fmt.Fprintf(e.output, "Enabled store changed date on entity %s\n", s.Name)
780-
781-
case ast.AlterEntityDropStoreOwner:
782-
entity.HasOwner = false
783-
if err := e.writer.UpdateEntity(dm.ID, entity); err != nil {
784-
return fmt.Errorf("failed to drop store owner: %w", err)
785-
}
786-
e.invalidateDomainModelsCache()
787-
fmt.Fprintf(e.output, "Disabled store owner on entity %s\n", s.Name)
788-
789-
case ast.AlterEntityDropStoreChangedBy:
790-
entity.HasChangedBy = false
791-
if err := e.writer.UpdateEntity(dm.ID, entity); err != nil {
792-
return fmt.Errorf("failed to drop store changed by: %w", err)
793-
}
794-
e.invalidateDomainModelsCache()
795-
fmt.Fprintf(e.output, "Disabled store changed by on entity %s\n", s.Name)
796-
797-
case ast.AlterEntityDropStoreCreatedDate:
798-
entity.HasCreatedDate = false
799-
if err := e.writer.UpdateEntity(dm.ID, entity); err != nil {
800-
return fmt.Errorf("failed to drop store created date: %w", err)
801-
}
802-
e.invalidateDomainModelsCache()
803-
fmt.Fprintf(e.output, "Disabled store created date on entity %s\n", s.Name)
804-
805-
case ast.AlterEntityDropStoreChangedDate:
806-
entity.HasChangedDate = false
807-
if err := e.writer.UpdateEntity(dm.ID, entity); err != nil {
808-
return fmt.Errorf("failed to drop store changed date: %w", err)
809-
}
810-
e.invalidateDomainModelsCache()
811-
fmt.Fprintf(e.output, "Disabled store changed date on entity %s\n", s.Name)
812-
813788
case ast.AlterEntitySetPosition:
814789
if s.Position == nil {
815790
return fmt.Errorf("no position provided")

mdl/grammar/MDLParser.g4

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -773,14 +773,6 @@ alterEntityAction
773773
| DROP COLUMN attributeName
774774
| SET DOCUMENTATION STRING_LITERAL
775775
| SET COMMENT STRING_LITERAL
776-
| SET STORE OWNER
777-
| SET STORE CHANGED BY
778-
| SET STORE CREATED DATE_TYPE
779-
| SET STORE CHANGED DATE_TYPE
780-
| DROP STORE OWNER
781-
| DROP STORE CHANGED BY
782-
| DROP STORE CREATED DATE_TYPE
783-
| DROP STORE CHANGED DATE_TYPE
784776
| SET POSITION LPAREN NUMBER_LITERAL COMMA NUMBER_LITERAL RPAREN
785777
| ADD INDEX indexDefinition
786778
| DROP INDEX IDENTIFIER

0 commit comments

Comments
 (0)