class_docstr: Inference rule that matches primary entities by their names.
  
  It will match columns such as `db.schema.mytable.mytable_id`,
  `db.schema.mytable.mytableid` and `db.schema.mytable.id`.
  
  It will always produce a ID.PRIMARY signal with VERY_HIGH confidence.
class_docstr_tok: ["Inference","rule","that","matches","primary","entities","by","their","names",".","It","will","match","columns","such","as","`","db.schema.mytable.mytable_id","`",",","`","db.schema.mytable.mytableid","`","and","`","db.schema.mytable.id","`",".","It","will","always","produce","a","ID.PRIMARY","signal","with","VERY_HIGH","confidence","."]
code: def match_column(self, props: ColumnProperties) -> bool:  # noqa: D
      col_lower = props.column.column_name.lower()
      table_lower = props.column.table_name.lower().rstrip("s")
  
      if col_lower == "id":
          return True
  
      return (
          col_lower == f"{table_lower}_id"
          or col_lower == f"{table_lower}id"
      )
  
imports: from __future__ import annotations
  from typing import List
  from metricflow.inference.context.data_warehouse import ColumnProperties, DataWarehouseInferenceContext, InferenceColumnType
  from metricflow.inference.models import InferenceSignal, InferenceSignalConfidence, InferenceSignalType
  from metricflow.inference.rule.base import InferenceRule
  from metricflow.inference.rule.rules import ColumnMatcherRule, LowCardinalityRatioRule
label_desc: Use image node_id 1 for calling the PrimaryEntityByNameRule obj's underlying member method code with example usage: obj.match_column(props) and returns: unknown, True