[{"data":1,"prerenderedAt":519},["ShallowReactive",2],{"navigation_docs":3,"-platform-system-migrations":200,"-platform-system-migrations-surround":514},[4,127,170],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":36},"Kinotic Apps","i-lucide-rocket","\u002Fapps","1.apps",[10,14,18,37,58,91,106,122],{"title":11,"path":12,"stem":13},"Introduction","\u002Fapps\u002Fintroduction","1.apps\u002F1.introduction",{"title":15,"path":16,"stem":17},"Quick Start","\u002Fapps\u002Fquick-start","1.apps\u002F2.quick-start",{"title":19,"icon":20,"path":21,"stem":22,"children":23,"page":36},"Application Structure","i-lucide-folder-tree","\u002Fapps\u002Fapplication-structure","1.apps\u002F3.application-structure",[24,28,32],{"title":25,"path":26,"stem":27},"Overview","\u002Fapps\u002Fapplication-structure\u002Foverview","1.apps\u002F3.application-structure\u002F1.overview",{"title":29,"path":30,"stem":31},"Applications and Projects","\u002Fapps\u002Fapplication-structure\u002Fapplications-and-projects","1.apps\u002F3.application-structure\u002F2.applications-and-projects",{"title":33,"path":34,"stem":35},"Artifact Types","\u002Fapps\u002Fapplication-structure\u002Fartifact-types","1.apps\u002F3.application-structure\u002F3.artifact-types",false,{"title":38,"icon":39,"path":40,"stem":41,"children":42,"page":36},"Services","i-lucide-network","\u002Fapps\u002Fservices","1.apps\u002F4.services",[43,46,50,54],{"title":25,"path":44,"stem":45},"\u002Fapps\u002Fservices\u002Foverview","1.apps\u002F4.services\u002F1.overview",{"title":47,"path":48,"stem":49},"Publishing Services","\u002Fapps\u002Fservices\u002Fpublishing-services","1.apps\u002F4.services\u002F2.publishing-services",{"title":51,"path":52,"stem":53},"Service Proxies","\u002Fapps\u002Fservices\u002Fservice-proxies","1.apps\u002F4.services\u002F3.service-proxies",{"title":55,"path":56,"stem":57},"Streaming","\u002Fapps\u002Fservices\u002Fstreaming","1.apps\u002F4.services\u002F4.streaming",{"title":59,"icon":60,"path":61,"stem":62,"children":63,"page":36},"Persistence","i-lucide-database","\u002Fapps\u002Fpersistence","1.apps\u002F5.persistence",[64,67,71,75,79,83,87],{"title":25,"path":65,"stem":66},"\u002Fapps\u002Fpersistence\u002Foverview","1.apps\u002F5.persistence\u002F1.overview",{"title":68,"path":69,"stem":70},"Defining Entities","\u002Fapps\u002Fpersistence\u002Fdefining-entities","1.apps\u002F5.persistence\u002F2.defining-entities",{"title":72,"path":73,"stem":74},"Entity Decorators","\u002Fapps\u002Fpersistence\u002Fentity-decorators","1.apps\u002F5.persistence\u002F3.entity-decorators",{"title":76,"path":77,"stem":78},"CRUD Operations","\u002Fapps\u002Fpersistence\u002Fcrud-operations","1.apps\u002F5.persistence\u002F4.crud-operations",{"title":80,"path":81,"stem":82},"Named Queries","\u002Fapps\u002Fpersistence\u002Fnamed-queries","1.apps\u002F5.persistence\u002F5.named-queries",{"title":84,"path":85,"stem":86},"Multi-Tenancy","\u002Fapps\u002Fpersistence\u002Fmulti-tenancy","1.apps\u002F5.persistence\u002F6.multi-tenancy",{"title":88,"path":89,"stem":90},"Migrations","\u002Fapps\u002Fpersistence\u002Fmigrations","1.apps\u002F5.persistence\u002F7.migrations",{"title":92,"icon":93,"path":94,"stem":95,"children":96,"page":36},"Security","i-lucide-shield-check","\u002Fapps\u002Fsecurity","1.apps\u002F6.security",[97,101],{"title":98,"path":99,"stem":100,"icon":93},"Access Control","\u002Fapps\u002Fsecurity\u002Faccess-control","1.apps\u002F6.security\u002F1.access-control",{"title":102,"path":103,"stem":104,"icon":105},"Authentication","\u002Fapps\u002Fsecurity\u002Fauthentication","1.apps\u002F6.security\u002F2.authentication","i-lucide-key-round",{"title":107,"icon":108,"path":109,"stem":110,"children":111,"page":36},"Deployment","i-lucide-cloud-upload","\u002Fapps\u002Fdeployment","1.apps\u002F7.deployment",[112,117],{"title":113,"path":114,"stem":115,"icon":116},"Deployment Workflow","\u002Fapps\u002Fdeployment\u002Fworkflow","1.apps\u002F7.deployment\u002F1.workflow","i-lucide-git-branch",{"title":118,"path":119,"stem":120,"icon":121},"Environments","\u002Fapps\u002Fdeployment\u002Fenvironments","1.apps\u002F7.deployment\u002F2.environments","i-lucide-server",{"title":123,"path":124,"stem":125,"icon":126},"CLI Reference","\u002Fapps\u002Fcli-reference","1.apps\u002F8.cli-reference","i-lucide-terminal",{"title":128,"icon":121,"path":129,"stem":130,"children":131,"page":36},"Kinotic OS","\u002Fplatform","2.platform",[132,137,141,146,151,156,161,166],{"title":133,"path":134,"stem":135,"icon":136},"System Architecture","\u002Fplatform\u002Farchitecture","2.platform\u002F1.architecture","i-lucide-boxes",{"title":138,"path":139,"stem":140,"icon":6},"Deployment Guide","\u002Fplatform\u002Fdeployment-guide","2.platform\u002F2.deployment-guide",{"title":142,"path":143,"stem":144,"icon":145},"Configuration","\u002Fplatform\u002Fconfiguration","2.platform\u002F3.configuration","i-lucide-settings",{"title":147,"path":148,"stem":149,"icon":150},"Organization Management","\u002Fplatform\u002Forganization-management","2.platform\u002F4.organization-management","i-lucide-building",{"title":152,"path":153,"stem":154,"icon":155},"System Security","\u002Fplatform\u002Fsystem-security","2.platform\u002F5.system-security","i-lucide-shield",{"title":157,"path":158,"stem":159,"icon":160},"Observability","\u002Fplatform\u002Fobservability","2.platform\u002F6.observability","i-lucide-activity",{"title":162,"path":163,"stem":164,"icon":165},"Contributing","\u002Fplatform\u002Fcontributing","2.platform\u002F7.contributing","i-lucide-git-pull-request",{"title":167,"path":168,"stem":169},"System Migrations","\u002Fplatform\u002Fsystem-migrations","2.platform\u002F8.system-migrations",{"title":171,"icon":172,"path":173,"stem":174,"children":175,"page":36},"Reference","i-lucide-book-open","\u002Freference","3.reference",[176,181,185,190,195],{"title":177,"path":178,"stem":179,"icon":180},"Decorators Reference","\u002Freference\u002Fdecorators","3.reference\u002F1.decorators","i-lucide-at-sign",{"title":182,"path":183,"stem":184,"icon":60},"Migration SQL Grammar","\u002Freference\u002Fmigration-sql-grammar","3.reference\u002F2.migration-sql-grammar",{"title":186,"path":187,"stem":188,"icon":189},"ABAC Expression Language","\u002Freference\u002Fabac-expression-language","3.reference\u002F3.abac-expression-language","i-lucide-file-code",{"title":191,"path":192,"stem":193,"icon":194},"CRI Format","\u002Freference\u002Fcri-format","3.reference\u002F4.cri-format","i-lucide-link",{"title":196,"path":197,"stem":198,"icon":199},"SDK Packages","\u002Freference\u002Fsdk-packages","3.reference\u002F5.sdk-packages","i-lucide-package",{"id":201,"title":167,"body":202,"description":508,"extension":509,"links":510,"meta":511,"navigation":385,"path":168,"seo":512,"stem":169,"__hash__":513},"docs\u002F2.platform\u002F8.system-migrations.md",{"type":203,"value":204,"toc":500},"minimark",[205,214,219,222,234,238,246,250,253,269,274,277,330,344,449,452,461,467,471,486,496],[206,207,208,209,213],"p",{},"The Kinotic platform uses the same migration SQL system as application developers to manage its own internal Elasticsearch indices. This page covers considerations specific to platform development — for general migration syntax, see ",[210,211,212],"a",{"href":89},"App Migrations",".",[215,216,218],"h2",{"id":217},"what-are-system-migrations","What Are System Migrations?",[206,220,221],{},"System migrations define and evolve the indices that the platform itself relies on — things like migration history tracking, system configuration, and other internal data stores. They run during platform startup before any application migrations and are scoped to the system project rather than a per-application project.",[206,223,224,225,229,230,233],{},"System migrations live in ",[226,227,228],"code",{},"kinotic-migration\u002Fsrc\u002Fmain\u002Fresources\u002Fmigrations\u002F"," and follow the same ",[226,231,232],{},"V\u003CN>__\u003Cdescription>.sql"," naming convention.",[215,235,237],{"id":236},"using-composite-types-in-system-indices","Using Composite Types in System Indices",[206,239,240,241,245],{},"OBJECT, NESTED, and UNION columns work the same way in system migrations as in application migrations. Refer to the ",[210,242,244],{"href":243},"\u002Fapps\u002Fpersistence\u002Fmigrations#composite-column-types","Composite Column Types"," section of the app documentation for syntax and examples.",[215,247,249],{"id":248},"deserializing-union-types","Deserializing Union Types",[206,251,252],{},"Elasticsearch stores UNION fields as a flat merged object — it has no knowledge of which variant a document contains. When reading documents back into Java, the platform needs to route deserialization to the correct subclass.",[206,254,255,256,260,261,264,265,268],{},"The standard approach is Jackson's polymorphic type handling, driven by a ",[257,258,259],"strong",{},"discriminator field"," stored in the document. This is the same ",[226,262,263],{},"kind"," (or similar) ",[226,266,267],{},"KEYWORD"," field you include in each union variant in the migration SQL.",[270,271,273],"h3",{"id":272},"example","Example",[206,275,276],{},"Given this migration:",[278,279,284],"pre",{"className":280,"code":281,"language":282,"meta":283,"style":283},"language-sql shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","CREATE TABLE assets (\n    id KEYWORD,\n    item UNION (\n        Book  (kind KEYWORD, title TEXT, isbn KEYWORD),\n        Video (kind KEYWORD, title TEXT, duration INTEGER)\n    )\n);\n","sql","",[226,285,286,294,300,306,312,318,324],{"__ignoreMap":283},[287,288,291],"span",{"class":289,"line":290},"line",1,[287,292,293],{},"CREATE TABLE assets (\n",[287,295,297],{"class":289,"line":296},2,[287,298,299],{},"    id KEYWORD,\n",[287,301,303],{"class":289,"line":302},3,[287,304,305],{},"    item UNION (\n",[287,307,309],{"class":289,"line":308},4,[287,310,311],{},"        Book  (kind KEYWORD, title TEXT, isbn KEYWORD),\n",[287,313,315],{"class":289,"line":314},5,[287,316,317],{},"        Video (kind KEYWORD, title TEXT, duration INTEGER)\n",[287,319,321],{"class":289,"line":320},6,[287,322,323],{},"    )\n",[287,325,327],{"class":289,"line":326},7,[287,328,329],{},");\n",[206,331,332,333,336,337,340,341,343],{},"The corresponding Java model uses ",[226,334,335],{},"@JsonTypeInfo"," and ",[226,338,339],{},"@JsonSubTypes"," to map the ",[226,342,263],{}," field value to the correct subclass:",[278,345,349],{"className":346,"code":347,"language":348,"meta":283,"style":283},"language-java shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = \"kind\")\n@JsonSubTypes({\n    @JsonSubTypes.Type(value = Book.class,  name = \"Book\"),\n    @JsonSubTypes.Type(value = Video.class, name = \"Video\")\n})\npublic abstract class Item {}\n\npublic class Book extends Item {\n    public String kind;\n    public String title;\n    public String isbn;\n}\n\npublic class Video extends Item {\n    public String kind;\n    public String title;\n    public Integer duration;\n}\n","java",[226,350,351,356,361,366,371,376,381,387,393,399,405,411,417,422,428,433,438,444],{"__ignoreMap":283},[287,352,353],{"class":289,"line":290},[287,354,355],{},"@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = \"kind\")\n",[287,357,358],{"class":289,"line":296},[287,359,360],{},"@JsonSubTypes({\n",[287,362,363],{"class":289,"line":302},[287,364,365],{},"    @JsonSubTypes.Type(value = Book.class,  name = \"Book\"),\n",[287,367,368],{"class":289,"line":308},[287,369,370],{},"    @JsonSubTypes.Type(value = Video.class, name = \"Video\")\n",[287,372,373],{"class":289,"line":314},[287,374,375],{},"})\n",[287,377,378],{"class":289,"line":320},[287,379,380],{},"public abstract class Item {}\n",[287,382,383],{"class":289,"line":326},[287,384,386],{"emptyLinePlaceholder":385},true,"\n",[287,388,390],{"class":289,"line":389},8,[287,391,392],{},"public class Book extends Item {\n",[287,394,396],{"class":289,"line":395},9,[287,397,398],{},"    public String kind;\n",[287,400,402],{"class":289,"line":401},10,[287,403,404],{},"    public String title;\n",[287,406,408],{"class":289,"line":407},11,[287,409,410],{},"    public String isbn;\n",[287,412,414],{"class":289,"line":413},12,[287,415,416],{},"}\n",[287,418,420],{"class":289,"line":419},13,[287,421,386],{"emptyLinePlaceholder":385},[287,423,425],{"class":289,"line":424},14,[287,426,427],{},"public class Video extends Item {\n",[287,429,431],{"class":289,"line":430},15,[287,432,398],{},[287,434,436],{"class":289,"line":435},16,[287,437,404],{},[287,439,441],{"class":289,"line":440},17,[287,442,443],{},"    public Integer duration;\n",[287,445,447],{"class":289,"line":446},18,[287,448,416],{},[206,450,451],{},"When inserting documents, always write the discriminator value:",[278,453,455],{"className":280,"code":454,"language":282,"meta":283,"style":283},"INSERT INTO assets (id, item) VALUES ('a1', '{\"kind\":\"Book\",\"title\":\"Clean Code\",\"isbn\":\"978-0132350884\"}') WITH REFRESH;\n",[226,456,457],{"__ignoreMap":283},[287,458,459],{"class":289,"line":290},[287,460,454],{},[206,462,463,464,466],{},"If the ",[226,465,263],{}," field is absent from a stored document, Jackson will fail to deserialize it. Ensure every INSERT that targets a UNION field includes the discriminator.",[270,468,470],{"id":469},"conflict-validation","Conflict validation",[206,472,473,474,477,478,481,482,485],{},"If two variants declare the same field name with different scalar types — e.g. ",[226,475,476],{},"title TEXT"," in one variant and ",[226,479,480],{},"title KEYWORD"," in another — the migration executor will throw an ",[226,483,484],{},"IllegalArgumentException"," at mapping time. Fields shared across variants must have identical types.",[206,487,488,491,492,495],{},[257,489,490],{},"Known limitation:"," Conflict detection is shallow for composite types. If two variants share a field name with the same composite type (OBJECT, NESTED, or UNION) but different sub-fields, no exception is thrown — only the first variant's sub-field definitions are used and the second's are silently dropped. Until named type support is added to the migration DSL, avoid sharing composite-typed fields across variants. Scalar shared fields (such as a ",[226,493,494],{},"kind KEYWORD"," discriminator) are always safe.",[497,498,499],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":283,"searchDepth":296,"depth":296,"links":501},[502,503,504],{"id":217,"depth":296,"text":218},{"id":236,"depth":296,"text":237},{"id":248,"depth":296,"text":249,"children":505},[506,507],{"id":272,"depth":302,"text":273},{"id":469,"depth":302,"text":470},"Writing and maintaining migration scripts for Kinotic's internal system indices.","md",null,{},{"title":167,"description":508},"AFJFi0Q-mCqfABegd2FZmWLlT2ODE-Lrusu8RJdCoNI",[515,517],{"title":162,"path":163,"stem":164,"description":516,"icon":165,"children":-1},"How to contribute to the Kinotic OS project.",{"title":177,"path":178,"stem":179,"description":518,"icon":180,"children":-1},"Complete reference for all Kinotic decorators.",1778641366690]