From efa3b081199a12a935856c02981c19a727c8815b Mon Sep 17 00:00:00 2001 From: Tom Klein Date: Sun, 22 Dec 2024 15:51:05 -0600 Subject: [PATCH 1/4] #4124 Filter names GenusGroup w/out gender + SpeciesGroup w/out part of speech --- .../filter/components/FilterView.vue | 7 +-- lib/queries/taxon_name/filter.rb | 43 ++++++++++++++++++- spec/lib/queries/taxon_name/filter_spec.rb | 33 ++++++++++++++ 3 files changed, 79 insertions(+), 4 deletions(-) diff --git a/app/javascript/vue/tasks/nomenclature/filter/components/FilterView.vue b/app/javascript/vue/tasks/nomenclature/filter/components/FilterView.vue index d7fc2622bb..79d6f9409a 100644 --- a/app/javascript/vue/tasks/nomenclature/filter/components/FilterView.vue +++ b/app/javascript/vue/tasks/nomenclature/filter/components/FilterView.vue @@ -108,18 +108,19 @@ const WITH_PARAMS = [ 'data_attributes', 'data_depictions', 'depictions', + 'leaves', // 'Descendants' 'etymology', 'global_identifiers', - 'leaves', + 'not_specified', // 'Incomplete combination relationships' + 'latinized', 'local_identifiers', 'nomenclature_date', - 'not_specified', 'notes', 'origin_citation', 'original_combination', 'otus', 'tags', - 'type_metadata', + 'type_metadata', // 'Type information' 'verbatim_name' ] diff --git a/lib/queries/taxon_name/filter.rb b/lib/queries/taxon_name/filter.rb index 99f2beefb0..7e62644320 100644 --- a/lib/queries/taxon_name/filter.rb +++ b/lib/queries/taxon_name/filter.rb @@ -24,6 +24,7 @@ class Filter < Query::Filter :descendants_max_depth, :epithet_only, :etymology, + :latinized, :leaves, :name, :name_exact, @@ -264,6 +265,15 @@ class Filter < Query::Filter # if 'false' then return only names with descendents attr_accessor :leaves + # @return [Boolean, nil] + # &latinized=<"true"|"false"> + # if 'true' then return only genus group names with gender and species + # group names with part of speech + # if 'false' then return only genus group names without gender and + # species group names without part of speech + # if nil, ignore + attr_accessor :latinized + # @return [String, nil] # &taxon_name_type= attr_accessor :taxon_name_type @@ -314,6 +324,7 @@ def initialize(query_params) @descendants_max_depth = params[:descendants_max_depth] @etymology = boolean_param(params, :etymology) @epithet_only = params[:epithet_only] + @latinized = boolean_param(params, :latinized) @geo_json = params[:geo_json] @leaves = boolean_param(params, :leaves) @name = params[:name] @@ -562,6 +573,35 @@ def leaves_facet leaves ? ::TaxonName.leaves : ::TaxonName.not_leaves end + # @return Scope + def latinized_facet + return nil if latinized.nil? + + tnc = ::TaxonNameClassification.arel_table + if latinized == true + ::TaxonName.where( + ::TaxonNameClassification.where( + tnc[:taxon_name_id].eq(::TaxonName.arel_table[:id]).and( + tnc[:type].matches('%latinized%') + ) + ).arel.exists + ) + else + ::TaxonName + .where( + "rank_class ILIKE '%speciesgroup%' OR \ + rank_class ILIKE '%genusgroup%'" + ) + .where.not( + ::TaxonNameClassification.where( + tnc[:taxon_name_id].eq(::TaxonName.arel_table[:id]).and( + tnc[:type].matches('%latinized%') + ) + ).arel.exists + ) + end + end + # @return Scope # wrapped in descendant_facet! def taxon_name_relationship_facet(hsh) @@ -844,12 +884,13 @@ def merge_clauses combination_taxon_name_id_facet, combinations_facet, descendant_facet, + latinized_facet, leaves_facet, not_specified_facet, original_combination_facet, otu_id_facet, - taxon_name_author_id_facet, otus_facet, + taxon_name_author_id_facet, taxon_name_classification_facet, taxon_name_relationship_type_facet, type_metadata_facet, diff --git a/spec/lib/queries/taxon_name/filter_spec.rb b/spec/lib/queries/taxon_name/filter_spec.rb index 3a9d6d3ebc..5e1d805d3d 100644 --- a/spec/lib/queries/taxon_name/filter_spec.rb +++ b/spec/lib/queries/taxon_name/filter_spec.rb @@ -121,6 +121,39 @@ expect(query.all.map(&:id)).to contain_exactly(genus.id, root.id) end + context '#latinized' do + let!(:fem_genus) { + g = Protonym.create!(name: 'Rosa', + rank_class: Ranks.lookup(:iczn, 'genus'), parent: root) + TaxonNameClassification::Latinized::Gender::Feminine.create!(taxon_name: g) + g + } + + let!(:fem_species) { + s = Protonym.create!( + name: 'blanda', + rank_class: Ranks.lookup(:iczn, 'species'), + parent: fem_genus + ) + TaxonNameClassification::Latinized::PartOfSpeech::Adjective.create!(taxon_name: s) + s + } + + specify '#latinized true' do + query.latinized = true + expect(query.all.map(&:id)).to contain_exactly( + fem_genus.id, fem_species.id + ) + end + + specify '#latinized false' do + query.latinized = false + expect(query.all.map(&:id)).to contain_exactly( + genus.id, original_genus.id, species.id + ) + end + end + specify "#nomenclature_group 1" do query.nomenclature_group = "Species" expect(query.all.map(&:id)).to contain_exactly(species.id) From a98f249f14480efb8d94503026e789957940dcc4 Mon Sep 17 00:00:00 2001 From: Tom Klein Date: Fri, 7 Feb 2025 20:41:46 -0600 Subject: [PATCH 2/4] Include note on broadness of 'with gender' search across all ranks #4124 --- lib/queries/taxon_name/filter.rb | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib/queries/taxon_name/filter.rb b/lib/queries/taxon_name/filter.rb index 7e62644320..53b0e05fe7 100644 --- a/lib/queries/taxon_name/filter.rb +++ b/lib/queries/taxon_name/filter.rb @@ -579,6 +579,9 @@ def latinized_facet tnc = ::TaxonNameClassification.arel_table if latinized == true + # Note the query here does not restrict to genus/species groups - a + # genus whose rank is changed to subfamily can retain its gender, + # e.g., and we want to include those here. ::TaxonName.where( ::TaxonNameClassification.where( tnc[:taxon_name_id].eq(::TaxonName.arel_table[:id]).and( From 24f1e39ad3a3f1536bc77ab9ae1a798e1f58191e Mon Sep 17 00:00:00 2001 From: Tom Klein Date: Mon, 10 Feb 2025 15:39:22 -0600 Subject: [PATCH 3/4] Do some query cleanup in TN latinized_facet --- lib/queries/taxon_name/filter.rb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/queries/taxon_name/filter.rb b/lib/queries/taxon_name/filter.rb index 53b0e05fe7..f0b516aa4e 100644 --- a/lib/queries/taxon_name/filter.rb +++ b/lib/queries/taxon_name/filter.rb @@ -584,8 +584,8 @@ def latinized_facet # e.g., and we want to include those here. ::TaxonName.where( ::TaxonNameClassification.where( - tnc[:taxon_name_id].eq(::TaxonName.arel_table[:id]).and( - tnc[:type].matches('%latinized%') + tnc[:taxon_name_id].eq(table[:id]).and( + tnc[:type].in(LATINIZED_TAXON_NAME_CLASSIFICATION_NAMES) ) ).arel.exists ) @@ -597,8 +597,8 @@ def latinized_facet ) .where.not( ::TaxonNameClassification.where( - tnc[:taxon_name_id].eq(::TaxonName.arel_table[:id]).and( - tnc[:type].matches('%latinized%') + tnc[:taxon_name_id].eq(table[:id]).and( + tnc[:type].in(LATINIZED_TAXON_NAME_CLASSIFICATION_NAMES) ) ).arel.exists ) From d0e9de2c875da2f14c066726a4db56805fc9d587 Mon Sep 17 00:00:00 2001 From: Tom Klein Date: Mon, 10 Feb 2025 16:29:27 -0600 Subject: [PATCH 4/4] Cleanup TN latinized filter query again --- lib/queries/taxon_name/filter.rb | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/queries/taxon_name/filter.rb b/lib/queries/taxon_name/filter.rb index f0b516aa4e..f56063b345 100644 --- a/lib/queries/taxon_name/filter.rb +++ b/lib/queries/taxon_name/filter.rb @@ -592,8 +592,7 @@ def latinized_facet else ::TaxonName .where( - "rank_class ILIKE '%speciesgroup%' OR \ - rank_class ILIKE '%genusgroup%'" + table[:rank_class].in(GENUS_AND_SPECIES_RANK_NAMES) ) .where.not( ::TaxonNameClassification.where(