215 def from_felis(cls, dm_constr: felis.datamodel.Constraint, columns: Mapping[str, Column]) -> Constraint:
216 """Convert Felis constraint definition into instance of this class.
217
218 Parameters
219 ----------
220 dm_const : `felis.datamodel.Constraint`
221 Felis constraint definition.
222 columns : `~collections.abc.Mapping` [`str`, `Column`]
223 Mapping of column ID to `Column` instance.
224
225 Returns
226 -------
227 constraint : `Constraint`
228 Converted constraint definition.
229 """
230 if isinstance(dm_constr, felis.datamodel.UniqueConstraint):
231 return UniqueConstraint(
232 name=dm_constr.name,
233 id=dm_constr.id,
234 columns=[columns[c] for c in dm_constr.columns],
235 deferrable=dm_constr.deferrable,
236 initially=dm_constr.initially,
237 description=dm_constr.description,
238 annotations=_strip_keys(
239 dict(dm_constr),
240 ["name", "type", "id", "columns", "deferrable", "initially", "description"],
241 ),
242 )
243 elif isinstance(dm_constr, felis.datamodel.ForeignKeyConstraint):
244 return ForeignKeyConstraint(
245 name=dm_constr.name,
246 id=dm_constr.id,
247 columns=[columns[c] for c in dm_constr.columns],
248 referenced_columns=[columns[c] for c in dm_constr.referenced_columns],
249 deferrable=dm_constr.deferrable,
250 initially=dm_constr.initially,
251 description=dm_constr.description,
252 annotations=_strip_keys(
253 dict(dm_constr),
254 [
255 "name",
256 "id",
257 "type",
258 "columns",
259 "deferrable",
260 "initially",
261 "referenced_columns",
262 "description",
263 ],
264 ),
265 )
266 elif isinstance(dm_constr, felis.datamodel.CheckConstraint):
267 return CheckConstraint(
268 name=dm_constr.name,
269 id=dm_constr.id,
270 expression=dm_constr.expression,
271 deferrable=dm_constr.deferrable,
272 initially=dm_constr.initially,
273 description=dm_constr.description,
274 annotations=_strip_keys(
275 dict(dm_constr),
276 ["name", "id", "type", "expression", "deferrable", "initially", "description"],
277 ),
278 )
279 else:
280 raise TypeError(f"Unexpected constraint type: {dm_constr.type}")
281
282
283@dataclasses.dataclass