Skip to content

Commit

Permalink
docs: naming rules for Named Structs
Browse files Browse the repository at this point in the history
  • Loading branch information
vbarua committed Aug 21, 2024
1 parent 8ae1084 commit 28ed4bc
Show file tree
Hide file tree
Showing 2 changed files with 79 additions and 0 deletions.
1 change: 1 addition & 0 deletions site/docs/types/_config
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,4 @@ arrange:
- type_classes.md
- type_variations.md
- type_parsing.md
- named_struct.md
78 changes: 78 additions & 0 deletions site/docs/types/named_struct.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
# Named Struct
A Named Struct is a special type construct that combines:
* A Struct type
* A list of names for the fields in the Struct, in depth-first search order

The depth-first search order for names arises from the the ability to nest Structs within other types. All struct fields must be named, even nested fields.

Named Structs are most commonly used to model the schema of Read relations.

## Determining Names
When producing/consuming names for a NamedStruct, some types requires special handling:

### Struct
A struct has names for each of its inner fields.

For example, the following Struct
```
a b
struct<i64, fp64>
```
has 2 names, one for each of its inner fields.

### Nested Structs
Struct types nested in other types must also be be named.

#### Structs within Maps
If a Map contains Structs, the Struct fields must be named. For example the following Map
```
a b c d e
map<struct<i64, fp64>, struct<i64, i64, i64>>
```
has 5 named fields
* 2 names [b, c] for the struct fields used as a key
* 3 names [d, e, f] for the struct fields used as a value

#### Structs within List
If a List contains Structs, the Struct fields must be named. For example the following List
```
b c
list<struct<i64, fp64>>
```
has 2 named fields [a, b] for the struct fields.

#### Structs within Struct
Structs can also be embedded within Structs.

A Struct like
```
a b c d e f g
struct<struct<i64, fp64>, struct<i64, i64, i64>>
```
has 7 names
* 1 name [a] for the 1st nested struct field
* 2 names [b, c] for the fields within the 1st nested struct
* 1 name [d] the for the 2nd nested struct field
* 3 names [e, f, g] for the fields within the 2nd nested struct

### Putting It All Together

#### Simple Named Struct
```
NamedStruct {
names: [a, b, c, d]
// a b c d
struct: struct<i64, list<i64>, map<i64, fp64>, fp64>
}
```

#### Named Struct w/ Nested Structs
```
NamedStruct {
names: [a, b, c, d, e, f, g, h]
// a b c d e f g h
struct: struct<i64, list<struct<i64, i64>>, map<i64, struct<fp64, fp64>>, fp64>
}
```

0 comments on commit 28ed4bc

Please sign in to comment.