@@ -49,45 +49,49 @@ fn add_field(
4949) {
5050 let field_name = field. get_name ( ) ;
5151 let parent_name = node_types:: node_type_name ( & field. parent . kind , field. parent . named ) ;
52- match field. storage {
53- node_types:: Storage :: Table { .. } => {
52+ match & field. storage {
53+ node_types:: Storage :: Table ( has_index ) => {
5454 // This field can appear zero or multiple times, so put
5555 // it in an auxiliary table.
5656 let field_type = make_field_type ( & parent_name, & field_name, & field. types , entries) ;
57+ let parent_column = dbscheme:: Column {
58+ unique : !* has_index,
59+ db_type : dbscheme:: DbColumnType :: Int ,
60+ name : node_types:: escape_name ( & parent_name) ,
61+ ql_type : ql:: Type :: AtType ( node_types:: escape_name ( & parent_name) ) ,
62+ ql_type_is_ref : true ,
63+ } ;
64+ let index_column = dbscheme:: Column {
65+ unique : false ,
66+ db_type : dbscheme:: DbColumnType :: Int ,
67+ name : "index" . to_string ( ) ,
68+ ql_type : ql:: Type :: Int ,
69+ ql_type_is_ref : true ,
70+ } ;
71+ let field_column = dbscheme:: Column {
72+ unique : true ,
73+ db_type : dbscheme:: DbColumnType :: Int ,
74+ name : node_types:: escape_name ( & field_type) ,
75+ ql_type : ql:: Type :: AtType ( field_type) ,
76+ ql_type_is_ref : true ,
77+ } ;
5778 let field_table = dbscheme:: Table {
5879 name : format ! ( "{}_{}" , parent_name, field_name) ,
59- columns : vec ! [
60- // First column is a reference to the parent.
61- dbscheme:: Column {
62- unique: false ,
63- db_type: dbscheme:: DbColumnType :: Int ,
64- name: node_types:: escape_name( & parent_name) ,
65- ql_type: ql:: Type :: AtType ( node_types:: escape_name( & parent_name) ) ,
66- ql_type_is_ref: true ,
67- } ,
68- // Then an index column.
69- dbscheme:: Column {
70- unique: false ,
71- db_type: dbscheme:: DbColumnType :: Int ,
72- name: "index" . to_string( ) ,
73- ql_type: ql:: Type :: Int ,
74- ql_type_is_ref: true ,
75- } ,
76- // And then the field
77- dbscheme:: Column {
78- unique: true ,
79- db_type: dbscheme:: DbColumnType :: Int ,
80- name: node_types:: escape_name( & field_type) ,
81- ql_type: ql:: Type :: AtType ( field_type) ,
82- ql_type_is_ref: true ,
83- } ,
84- ] ,
80+ columns : if * has_index {
81+ vec ! [ parent_column, index_column, field_column]
82+ } else {
83+ vec ! [ parent_column, field_column]
84+ } ,
8585 // In addition to the field being unique, the combination of
8686 // parent+index is unique, so add a keyset for them.
87- keysets : Some ( vec ! [
88- node_types:: escape_name( & parent_name) ,
89- "index" . to_string( ) ,
90- ] ) ,
87+ keysets : if * has_index {
88+ Some ( vec ! [
89+ node_types:: escape_name( & parent_name) ,
90+ "index" . to_string( ) ,
91+ ] )
92+ } else {
93+ None
94+ } ,
9195 } ;
9296 entries. push ( dbscheme:: Entry :: Table ( field_table) ) ;
9397 }
0 commit comments