yumemi/gen/emit/typing
クエリ値から戻りの型と穴の型を静的に導く。判断は入らない(20「規則は7つ」)。
Types
with の子。with の名・欄の名(SQL の AS)・子の Entity の名。解けない項は落とす
(SQL 層が同じ relation で exit 4 / 1 を出す)。
pub type Child {
Child(name: String, output: String, entity: String)
}
Constructors
-
Child(name: String, output: String, entity: String)
型の木。module は import の道。render で修飾するかを決める。
pub type Ty {
TyRef(module: option.Option(String), name: String)
TyApp(head: Ty, args: List(Ty))
TyTuple(List(Ty))
}
Constructors
-
TyRef(module: option.Option(String), name: String) -
-
TyTuple(List(Ty))
Values
pub fn child_columns(
app: model.App,
select: model.Select,
child: Child,
) -> List(String)
with の子について選んだ列。空なら子は従来どおり全列(to_jsonb、List(子の Entity))。
pub fn child_label(app: model.App, field_name: String) -> String
子の列の欄の名。子の record の欄と SQL の jsonb_build_object の key は同じ。
pub fn child_picked_name(
query_name: String,
output: String,
) -> String
列を選んだ子の record 型の名。listed の photos -> ListedPhotosRow。
pub fn child_records(
app: model.App,
query: model.NamedQuery,
) -> List(#(String, List(#(String, Ty))))
列を選んだ子の record(名と欄)。選んでいない子は載せない。reads module に置く。
pub fn children(
app: model.App,
select: model.Select,
) -> List(Child)
pub fn field_optional(app: model.App, field_name: String) -> Bool
pub fn out(app: model.App, query: model.NamedQuery) -> Ty
戻りの型。20「read 関数の戻りの型はクエリ値から静的に導く」の表そのまま。
pub fn owner(
app: model.App,
select: model.Select,
field_name: String,
) -> Owner
pub fn params(
app: model.App,
select: model.Select,
) -> List(Param)
穴の並びは、クエリ値の中で最初に現れた順。P の宣言順ではない。
pub fn picked_fields(
app: model.App,
query: model.NamedQuery,
) -> List(#(String, Ty))
record の欄(名と型)。選んだ行の列 + with の子 + along の値の順。SQL の SELECT 句と同じ並び。
列を選んだ子は List(<子の record>)、選んでいない子は List(子の Entity)。
pub fn picked_label(
app: model.App,
select: model.Select,
field_name: String,
) -> String
選んだ列の欄の名。from の列は Property の名(RosterName -> name)、
join した Entity の列は Entity の名を前に付ける(StoreName -> store_name)。
SQL は同じ名で AS を付けて返す ── 行の JSON の欄名と record の欄名は一致する。
pub fn picked_labels(
app: model.App,
select: model.Select,
) -> List(String)
record の欄の名だけ(SQL 層の衝突の検査用)。並びは picked_fields と同じ。
pub fn picked_name(query_name: String) -> String
列を選んだ読みの record 型の名。listed -> ListedRow。reads module に置く。
pub fn row(app: model.App, query: model.NamedQuery) -> Ty
1行の型。from の Entity(Lifecycle があれば相を添える)+ join した Entity +
with で畳んだ子の List + along の値。並びは SQL の SELECT 句と同じ。
列を選んだ読み(q.Pick)は、選んだ列の record(picked_name)。
join / with の項は SQL 層と同じ relation で解く。解けない項はここでは落とすが、
SQL 層が同じ理由で exit 4 / 1 を出す(片方だけ通ることは無い)。
pub fn row_columns(
app: model.App,
select: model.Select,
) -> List(String)
行の列(from / join)として選んだ列。with の子の列は含めない。
pub fn type_ref(reference: model.TypeRef) -> Ty
model の型参照を出力用の型木へ戻す。Property の型引数もここで保持する。
pub fn with_types(
app: model.App,
select: model.Select,
) -> List(#(String, Ty))
with で畳んだ子。欄の名(SQL の AS)と List(子)。