Sow & Mow
To learn more about the architecture of csvs, see other User Guides, the Reference and the Requirements.
sow
Entry -> Grain -> Trait -> Thing -> Entry
puts one field from Grain into Record
sow will find a place in Record that has the same value of Trait as Grain, and insert a Thing nearby.
how it can tell whether to insert the thing as leaf or trunk is beyond me. i guess it assumes thing is always leaf of trait?
base = record._
if base equals thing
append grain.thing to record.thing
if base equals trait
append grain.thing to record.thing
if record has trait
for each item of record.trait
if item.trait equals grain.trait
append grain.thing to item.thing
otherwise
for each field of record
for each item of record.field
sow grain to item
test cases
-
- initial: record 2001
- grain: grain 2001
- trait: datum
- thing: actdate
- expected: record 2001 sow
-
- initial: record array
- grain: grain array
- trait: export tags
- thing: export 1 tag
- expected: record array sow
-
- initial: record sow base is trait
- grain: grain sow base is trait
- trait: datum
- thing: filepath
- expected: record sow base is trait
mow
Entry -> Trait -> Thing -> List Grain
Break Record down into grains of Trait and Thing
mow will find all individual trait-thing relations in the record
base = record._
<!-- TODO: weird trait/thing mix here -->
if base equals thing
for each item of record.trait
return { _: base, base: record.base, trait: item.trait }
<!-- TODO: weird trait/thing mix here -->
if base equals trait
for each item of record.thing
return { _: base, base: record.base, thing: item.thing }
if record has trait
for each trunk of record.trait
for each leaf of item.thing
return { _: trait, trait: trunk, thing: leaf }
otherwise
for each field of record
mow each item of record.field
test cases
- first level
- initial: record 2001
- trait: datum
- thing: actdate
- expected: grain 2001
- second level
- initial: record array
- trait: export 1 tag
- thing: export 1 channel
- expected: grain channel 1, grain channel 2
- empty
- initial: record mow empty
- trait: export 1 tag
- thing: export 1 channel
- expected: grain empty