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)

選んだ列の持ち主。from / join の行の列か、with の子の列か。 同じ Entity が行と子(または子 2 本)に居ると、どちらの列か決まらない。

pub type Owner {
  RowColumn
  ChildColumn(Child)
  Ambiguous
}

Constructors

  • RowColumn
  • ChildColumn(Child)
  • Ambiguous
pub type Param {
  Param(label: String, ty: Ty)
}

Constructors

  • Param(label: String, ty: Ty)

型の木。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)
  • TyApp(head: Ty, args: List(Ty))
  • TyTuple(List(Ty))

Values

pub fn agg_ty(app: model.App, value: model.Agg) -> Ty

集約の型。Count だけ空集合でも 0 なので Option を被せない。

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 column_ty(app: model.App, field_name: String) -> Ty

列の型。Option / List の列はその形のまま。

pub fn cursor() -> Ty
pub fn date() -> Ty
pub fn datetime() -> Ty
pub fn entity_modules(ty: Ty) -> List(String)

entity/* の道だけ。修飾の判断に使う。

pub fn field_base(app: model.App, field_name: String) -> Ty

列の基底型。Option は剥がした形。

pub fn field_optional(app: model.App, field_name: String) -> Bool
pub const float_ty: Ty
pub const int_ty: Ty
pub fn key_of(inner: Ty) -> Ty
pub fn list_of(inner: Ty) -> Ty
pub fn modules(ty: Ty) -> List(String)

木に現れる module の道を全部集める。

pub fn option(inner: Ty) -> Ty
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 page(inner: Ty) -> Ty
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(子)。

✨ Search Document