Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

(WIP) Add scoped record id column #30

Open
wants to merge 2 commits into
base: main
Choose a base branch
from

Conversation

mhol5152
Copy link

@mhol5152 mhol5152 commented Nov 25, 2024

Add scoped record id column

Motivation and context

Přidání možnosti opakování záznamů v tabulce v jiném podstromu díky sloupci scoped_record_id_column.

Využíváme v demand workflow - vícekrokové poptávce. Pokud chceme mít možnost opakovat nějaké prvky (kroky nebo celé stromy) v rámci různých workflow, musí být dodatečně určeno, kterému konkrétnímu stromu vazba v tabulce patří. Nevýhodou je, že krok jako takový tuto informaci nemá a je třeba zadat mu ji zvenčí. To je realizováno pomocí attr_accessor, jehož jméno je definováno v parametru scoped_record_id_column.

Vzhledem k tomu, že jsem na tom pracoval mimo tento gem a sem jsem nahrál rovnou až výsledek, není tu zaznamenána historie commitů. První největší se týkal pouze refactoringu, aby styl odpovídal rubocopu používaném v Nere.

Z tohoto důvodu raději přidám komentáře přímo do kódu, abych objasnil změny. Kde komentáře nejsou, tam jde v podstatě pouze o refactor dle rubocopa.

Změnil jsem verzi na 5.0.0

TODO: přidat testy.

def direct_column_name
acts_as_dag_options[:direct_column]
end
def scoped_record_id_column_name
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Jméno sloupce s id záznamu, ke kterému se daná část stromu vztahuje

end

def scoped_record_id
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

id sloupce scoped_record_id_column_name. Pokud není definován, vrací se nil. Jde pořád o volitelný parametr a vše musí fungovat i bez něj.

Comment on lines +70 to +72
uniqueness_scope = [ancestor_type_column_name, descendant_type_column_name, descendant_id_column_name]
uniqueness_scope << scoped_record_id_column_name.to_sym if scoped_record_id_column_name.present?
validates ancestor_id_column_name.to_sym, uniqueness: { scope: uniqueness_scope }
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pro validaci je nutné přidat sloupec scoped_record_id_column_name, jinak by nešel vytvořit jiný strom se stejným záznamem.

uniqueness_scope << scoped_record_id_column_name.to_sym if scoped_record_id_column_name.present?
validates ancestor_id_column_name.to_sym, uniqueness: { scope: uniqueness_scope }

scope :with_ancestor, lambda { |ancestor, scoped_record_id = nil|
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Všechny scope musí mít možnost zaměřit konkrétní strom pomocí scoped_record_id

Comment on lines +104 to +106
uniqueness_scope = [descendant_id_column_name]
uniqueness_scope << scoped_record_id_column_name.to_sym if scoped_record_id_column_name.present?
validates ancestor_id_column_name.to_sym, uniqueness: { scope: uniqueness_scope }
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pro validaci je nutné přidat sloupec scoped_record_id_column_name, jinak by nešel vytvořit jiný strom se stejným záznamem.

def matches?(other)
self.id == other.id
id == other.id && scoped_record_id == other.scoped_record_id
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pro porovnání je třeba přidat scoped_record_id

def self.from_resource(resource)
self.new(resource.id)
# Factory Construction method that creates an endpoint from a model
def self.from_resource(resource, scoped_record_id)
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

U metod v tomto modelu bylo třeba přidat scoped_record_id tak, aby ho bylo možné předávat dál.

base.send(:include, EdgeInstanceMethods)
end

def ancestor_scoped_record_id(ancestor)
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Když se vytváří hrana stromu, doplňují se i nepřímé hrany. Během toho nesmím zapomenout předávat hodnotu scoped_record_id, aby hrany spadaly do jednoho stromu.
Podmínky níže by možná měly být opačně a možná by stačila jen
ancestor.public_send(scoped_record_id_column_name) if scoped_record_id_column_name
To ještě prozkoumám.

sink = self::EndPoint.from(descendant)
conditions = self.conditions_for(source, sink)
path = self.new(conditions)
scoped_record_id = ancestor_scoped_record_id(ancestor)
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Původně jsem chtěl volat def build_edge(ancestor, descendant, scoped_record_id), ale jak se to pořád zanořuje dál, tak bylo jednodušší brát to id z ancestor.

def self.from_resource(resource)
self.new(resource.id, resource.class.to_s)
# Factory Construction method that creates an EndPoint instance from a model
def self.from_resource(resource, scoped_record_id)
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Narovinu se přiznám, že jsem ty end pointy úplně nepobral. Akorát bylo nutné všude možně přidat scoped_record_id, aby si ho mohly předávat dál a vytvářeli se hrany s tím id, respektive se podle toho vyhledávalo.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant