edgedb-js icon indicating copy to clipboard operation
edgedb-js copied to clipboard

Making overloaded link required and subtyped in "grandchild" of inherited type breaks query builder

Open Arrow7000 opened this issue 2 years ago • 0 comments

Code

e.insert(e.StrategyGamer, {
    faveGame: strategyGame,
//  ^^^^^^^^^^^^^^^^^^^^^^ link `faveGame` is not allowed even though it should be
    firstName: "A",
    lastName: "A",
});

Schema

abstract type Game {
    # ...
}
type FpsGame extending Game {
    # ...
}
type StrategyGame extending Game {
    # ...
}

abstract type Person {
    link faveGame -> Game; # 👈 optional link
    required property firstName -> str;
    required property lastName -> str;
}
abstract type Gamer extending Person {
    # ...
}
type StrategyGamer extending Gamer {
    overloaded required link faveGame -> StrategyGame; # 👈 overloaded link, required and specialised subtype
}

Generated EdgeQL

The EdgeQL does generate correctly. It's just TS which isn't happy with it.

INSERT default::StrategyGamer {
  faveGame := (
    INSERT default::StrategyGame {
      # ...
    }
  ),
  firstName := "A",
  lastName := "A"
}

Error or desired behavior

faveGame is not an allowed property when trying to insert a new StrategyGamer. But not only should it be allowed - because StrategyGamer extends Person which has a link faveGame -> Game - but it should actually be required; since StrategyGamer overloads the link to make it required + more specialised.

This bug only seems to happen when the overloaded link is both required and refers to a subtype, but not when only one of those two changes are made.

There is no faveGame in the allowed insert query fields, not even optional image

But inserting a new Gamer - i.e. a direct inheritor of Person where faveGame is defined - does correctly know about faveGame image

Versions (please complete the following information):

  • OS: Windows 10 Home build 19045.2846
  • EdgeDB version (e.g. 2.0): 2.13+c171f92
  • EdgeDB CLI version (e.g. 2.0): 2.3.1+ef99779
  • edgedb-js version (e.g. 0.20.10;):
  • @edgedb/generate version (e.g. 0.0.7;): 0.1.0
  • Typescript version: 5.0.4
  • Node/Deno version: Node v18.15.0

Arrow7000 avatar May 06 '23 14:05 Arrow7000