Expand description
Handling “exchange structure graph” as tables
Since records in an exchange structure has references to other records, then consists a graph.
- An exchange structure corresponds to a graph, we call it “exchange structure graph” here.
- A node of graph corresponds to a record.
- An edge of graph corresponds to a reference in a record.
§Creating table from exchange structure AST
Let us consider a simple EXPRESS schema:
ENTITY a;
x: INTEGER;
y: INTEGER;
END_ENTITY;
ENTITY b;
z: INTEGER;
w: a;
END_ENTITY;Corresponding data section in STEP file will be something like following (skip HEADER section):
DATA;
#1 = A(1, 2);
#2 = A(3, 4);
#3 = B(5, #1);
#4 = B(6, #1);
#5 = B(7, #2);
#6 = B(8, A((9, 10)));
ENDSEC;In this example, #3 and #4 has reference to #1.
There will exist non-exclusive reference between entity instances generally,
and thus the data must be regarded as a graph.
step_p21 will parse this data section into following tables:
| Table (a) | x (i64) | y (i64) |
|---|---|---|
#1 | 1 | 2 |
#2 | 3 | 4 |
| Table (b) | z (i64) | w (a) |
|---|---|---|
#3 | 5 | #1 |
#4 | 6 | #1 |
#5 | 7 | #2 |
#6 | 8 | A((9, 10)) |
Each columns are defined by EXPRESS schema.
x, y, and z are specified as integer in EXPRESS, and will be treated
as i64 in Rust code. The simple types in EXPRESS are mapped into Rust
primitive types. The ENTITY a will be treated as a Rust struct like
struct A {
x: i64,
y: i64,
}The ENTITY b has to support both reference and inline struct like as #4
and #6. For this purpose, PlaceHolder exists:
enum PlaceHolder<T> {
/// For reference, e.g. `#1`
Ref(Name),
/// For inline typed parameter, e.g. `A((9, 10))`
Owned(T),
}Then following two Rust structs will be defined:
struct B {
z: i64,
w: A,
}
struct BHolder {
z: i64,
w: PlaceHolder<AHolder>,
}There also a function IntoOwned::into_owned to convert a holder struct
BHolder into owned struct B.
AHolder will also be introduced to keep consistency.
These are automated by step_p21_derive::Holder proc-macro.
Enums§
- Place
Holder - Owned value or reference through entity/value id
Traits§
- Entity
Table - Trait for tables which pulls an entity (
T) from an entity id (u64) - Holder
- Trait for a field of tables
- Into
Owned - Trait for resolving a reference through entity id
- Table
Init - Create Table from DataSection
- With
Visitor
Functions§
- get_
owned - insert_
record - Helper function to implement TableInit trait
- owned_
iter