75 void CMacroFunction_SwapRelatedFeaturesQual_Depr::TheFunction()
79 CRef<CScope> scope = m_DataIter->GetScopedObject().scope;
80 if (!src_feat || !scope)
94 src_objs = m_Args[0]->GetObjects();
97 x_GetObjectsFromRef(src_objs, 0);
100 if (src_objs.empty()) {
108 if (feat_list.empty()) {
114 new_feat->Assign(*orig_feat);
115 CObjectInfo objInfo(new_feat.GetPointer(), new_feat.GetPointer()->GetTypeInfo());
118 const string& dest_field = m_Args[2]->GetString();
119 if (!
GetFieldsByName(&dest_objs, objInfo, dest_field) || dest_objs.empty()) {
123 CMQueryNodeValue::TObs::iterator src_it = src_objs.begin();
124 CMQueryNodeValue::TObs::iterator dest_it = dest_objs.begin();
126 while (src_it != src_objs.end() && dest_it != dest_objs.end()) {
130 m_QualsChangedCount += 2;
136 if (m_QualsChangedCount) {
137 m_DataIter->SetModified();
141 m_DataIter->RunCommand(
cmd, m_CmdComposite);
144 report[
"swapping qualifiers"] = m_QualsChangedCount;
146 x_LogChangedQuals(fnc_log);
150 bool CMacroFunction_SwapRelatedFeaturesQual_Depr::x_ValidArguments()
const
152 if (m_Args.size() != 3) {
156 if (!(m_Args[0]->IsString() || m_Args[0]->AreObjects() || m_Args[0]->IsRef()))
159 for (
size_t index = 1; index < m_Args.size(); ++index) {
185 const string& field_name = m_Args[0]->GetString();
190 res_oi = m_Args[0]->GetObjects();
193 x_GetObjectsFromRef(res_oi, 0);
196 if (res_oi.empty()) {
200 m_QualsChangedCount = s_RemoveFields(m_DataIter, res_oi);
202 if (m_QualsChangedCount) {
204 report[
"removal of qualifiers"] = m_QualsChangedCount;
206 x_LogChangedQuals(fnc_log);
212 if (
m_Args.empty())
return false;
213 bool first_ok = (
m_Args[0]->IsString() ||
m_Args[0]->AreObjects() ||
m_Args[0]->IsRef());
214 return (
m_Args.size() == 1 && first_ok);
222 Int4 quals_changed = 0;
226 bool is_gene_suppressed_before =
false;
227 bool is_gene_suppressed_after =
false;
232 is_gene_suppressed_before = gene_xref && gene_xref->
IsSuppressed();
267 dataiter->SetToDelete(
true);
284 dataiter->SetToDelete(
true);
294 cleanup.BasicCleanup(*seq_feat);
299 if (!is_gene_suppressed_before && is_gene_suppressed_after)
313 dataiter->SetModified();
315 return quals_changed;
324 bsrc.
SetOrg().SetOrgname().ResetMod();
342 void CMacroFunction_RemoveModifier::TheFunction()
346 x_GetObjectsFromRef(res_oi, 0);
347 if (res_oi.empty()) {
361 m_QualsChangedCount++;
365 if (m_QualsChangedCount) {
369 m_DataIter->SetModified();
372 report[
"removing source modifiers"] = m_QualsChangedCount;
374 x_LogChangedQuals(fnc_log);
378 bool CMacroFunction_RemoveModifier::x_ValidArguments()
const
403 res_oi = m_Args[0]->GetObjects();
406 x_GetObjectsFromRef(res_oi, 0);
410 if (res_oi.empty()) {
416 x_RmvOutsideFields(res_oi, *options);
418 if (m_QualsChangedCount) {
420 m_DataIter->SetModified();
423 log << m_DataIter->GetBestDescr() <<
": removed text outside string in " << m_QualsChangedCount <<
" qualifiers";
425 bool update_mrna = (m_Args.size() == 10) ? m_Args[9]->GetBool() :
false;
431 CRef<CScope> scope = m_DataIter->GetScopedObject().scope;
436 m_DataIter->RunCommand(
cmd, m_CmdComposite);
437 log <<
", applied " + prot_product +
" to mRNA product name ";
447 string left_del =
m_Args[start_index + 1]->GetString();
448 bool remove_before_match =
false;
449 if (
m_Args[start_index]->GetBool()) {
461 remove_before_match =
m_Args[start_index + 2]->GetBool();
466 string right_del =
m_Args[start_index + 4]->GetString();
467 bool remove_after_match =
false;
468 if (
m_Args[start_index + 3]->GetBool()) {
480 remove_after_match =
m_Args[start_index + 5]->GetBool();
483 bool case_insensitive =
m_Args[start_index + 6]->GetBool();
484 bool whole_word =
m_Args[start_index + 7]->GetBool();
487 after_match, right_del, remove_after_match,
488 case_insensitive, whole_word));
494 for (
auto& it : resolved_objs) {
497 for (
auto& iter : objs) {
559 for (
size_t i = index;
i <
m_Args.size(); ++
i) {
580 const string& action_type = m_Args[++index]->GetString();
582 bool remove_field =
false;
583 x_GetOptionalArgs(
delimiter, remove_field, index);
590 if (remove_field && newValue.empty()) {
594 else if (!newValue.empty() && !
SetFieldsByName(&res_oi, oi, m_Args[0]->GetString())) {
599 res_oi = m_Args[0]->GetObjects();
602 x_GetObjectsFromRef(res_oi, 0);
605 if (res_oi.empty()) {
609 if (!newValue.empty()) {
610 vector<string> new_values;
612 x_SetFields(res_oi, newValue, existing_text, new_values);
614 m_Result->SetBool(
false);
615 if (m_QualsChangedCount) {
617 m_DataIter->SetModified();
618 m_Result->SetBool(
true);
621 for (
size_t i = 0;
i < new_values.size(); ++
i) {
622 log << m_DataIter->GetBestDescr() <<
": set '" << new_values[
i] <<
"' as a new value\n";
627 else if (remove_field) {
629 if (m_QualsChangedCount) {
631 log << m_DataIter->GetBestDescr() <<
": removed " << m_QualsChangedCount <<
" qualifiers";
640 size_t arg_nr =
m_Args.size();
641 if (arg_nr < 3 && arg_nr > 5) {
646 bool first_ok =
m_Args[index]->IsString() ||
m_Args[index]->AreObjects() ||
m_Args[index]->IsRef();
647 if (!first_ok)
return false;
651 bool second_ok =
m_Args[index]->IsString() ||
m_Args[index]->IsInt() ||
m_Args[index]->IsDouble();
652 if (!second_ok)
return false;
654 if (!
m_Args[++index]->IsString())
return false;
656 if (arg_nr > 3 && (!
m_Args[++index]->IsString() && !
m_Args[index]->IsBool()))
return false;
658 if (arg_nr > 4 && !
m_Args[++index]->IsBool())
return false;
666 for (
auto& it : objs) {
677 new_values.push_back(newValue);
694 new_values.push_back(newValue);
699 new_values.push_back(newValue);
704 if (objs.size() > 1) {
716 new_values.push_back(newValue);
744 new_values.push_back(orig_value);
755 void CMacroFunction_SetRnaProduct::TheFunction()
759 CRef<CScope> scope = m_DataIter->GetScopedObject().scope;
760 if (!seq_feat || !seq_feat->
GetData().
IsRna() || !scope)
765 const string& action_type = m_Args[++index]->GetString();
767 bool remove_field =
false;
768 x_GetOptionalArgs(
delimiter, remove_field, index);
777 if (!newValue.empty()) {
781 m_QualsChangedCount++;
782 if (!remainder.empty()) {
790 else if (remove_field) {
793 m_QualsChangedCount++;
796 if (m_QualsChangedCount) {
797 m_DataIter->SetModified();
800 log << m_DataIter->GetBestDescr();
801 if (newValue.empty() && remove_field) {
802 log <<
": removed rna product";
805 log <<
": set '" << orig_value <<
"' as new rna product value";
811 bool CMacroFunction_SetRnaProduct::x_ValidArguments()
const
814 size_t arg_nr = m_Args.size();
815 if (arg_nr < 2 && arg_nr > 4) {
821 bool first_ok = m_Args[index]->IsString() || m_Args[index]->IsInt() || m_Args[index]->IsDouble();
822 if (!first_ok)
return false;
824 if (!m_Args[++index]->IsString())
return false;
825 if (arg_nr > 2 && (!m_Args[++index]->IsString() && !m_Args[index]->IsBool()))
return false;
826 if (arg_nr > 3 && !m_Args[++index]->IsBool())
return false;
838 void CMacroFunction_GetRnaProduct::TheFunction()
842 CRef<CScope> scope = m_DataIter->GetScopedObject().scope;
843 m_Result->SetNotSet();
850 if (m_Nested == eNotNested) {
851 m_Result->SetString(
value);
856 new_node->SetString(
value);
857 m_Result->SetRef(new_node);
861 bool CMacroFunction_GetRnaProduct::x_ValidArguments()
const
863 return (m_Args.empty());
870 void CMacroFunction_RemoveRnaProduct::TheFunction()
874 CRef<CScope> scope = m_DataIter->GetScopedObject().scope;
875 if (!edit_feat || !edit_feat->
GetData().
IsRna() || !scope)
882 m_DataIter->SetModified();
883 m_QualsChangedCount++;
886 report[
"removing RNA product"] = m_QualsChangedCount;
888 x_LogChangedQuals(fnc_log);
891 bool CMacroFunction_RemoveRnaProduct::x_ValidArguments()
const
893 return (m_Args.empty());
908 const string&
location = m_Args[++index]->GetString();
909 bool case_sensitive = m_Args[++index]->GetBool();
910 bool is_regex = (++index < m_Args.size()) ? m_Args[index]->GetBool() :
false;
912 m_Result->SetBool(
false);
923 res_oi = m_Args[0]->GetObjects();
926 x_GetObjectsFromRef(res_oi, 0);
930 if (res_oi.empty()) {
934 x_EditFields(res_oi, find_txt, repl_txt, s_GetLocFromName(
location), case_sensitive, is_regex);
935 if (m_QualsChangedCount) {
938 m_DataIter->SetModified();
939 m_Result->SetBool(
true);
942 log << m_DataIter->GetBestDescr() <<
": edited " << m_QualsChangedCount <<
" qualifiers, replaced " << find_txt;
944 repl_txt.assign(
"''");
946 log <<
" with " << repl_txt;
952 const string& replace,
ESearchLoc loc,
bool case_sensitive,
bool is_regex)
976 while (pos !=
NPOS) {
977 str =
str.substr(0, pos) + replace +
str.substr(pos + find.length());
978 if (case_sensitive) {
994 else if (loc ==
eEnd) {
996 pos =
str.length() - find.length();
1000 str =
str.substr(0, pos) + replace +
str.substr(pos + find.length());
1012 const string& find_txt,
1013 const string& repl_txt,
1015 bool case_sensitive,
1018 for (
auto& it : resolved_objs) {
1021 for(
auto& iter : objs) {
1025 if (
s_EditText(
value, find_txt, repl_txt, loc, case_sensitive, is_regex)) {
1043 if (
s_EditText(orig_val, find_txt, repl_txt, loc, case_sensitive, is_regex)) {
1058 if (
s_EditText(
value, find_txt, repl_txt, loc, case_sensitive, is_regex)) {
1094 bool first_ok =
m_Args[0]->IsString() ||
m_Args[0]->AreObjects() ||
m_Args[0]->IsRef();
1099 for (
size_t index = 1; index < 3; index++) {
1100 if (!
m_Args[index]->IsString() && !
m_Args[index]->IsInt()) {
1104 if (
m_Args.size() == 6) {
1105 if (!
m_Args.back()->IsBool())
1115 vector<string>
kSatelliteTypes = {
"satellite",
"microsatellite",
"minisatellite" };
1116 vector<string> kMobileETypeTypes = {
1117 "insertion sequence",
1121 "non-LTR retrotransposon",
1127 "transposable element",
1134 bool IstRNAProductField(
const CSeq_feat& feat,
const string& field_name);
1141 return GetBioSourceDestObjects(oi, field_name,
result);
1145 return SetFeatDestinationField(
Ref(feat), field_name,
result);
1153 if (field_name.empty())
1156 size_t orig_size = dest_objs.size();
1169 if ((*subsrc)->IsSetSubtype() && (*subsrc)->GetSubtype() == st) {
1170 CObjectInfo subsrc_oi((*subsrc).GetPointer(), (*subsrc)->GetTypeInfo());
1176 if (dest_objs.empty()) {
1178 sub_src->SetSubtype(st);
1180 CObjectInfo subsrc_oi(sub_src.GetPointer(), sub_src->GetTypeInfo());
1190 if ((*orgmod)->IsSetSubtype() && (*orgmod)->GetSubtype() == st) {
1191 CObjectInfo orgmod_oi((*orgmod).GetPointer(), (*orgmod)->GetTypeInfo());
1197 if (dest_objs.empty()) {
1199 orgmod->SetSubtype(st);
1203 orgname->SetMod().push_back(orgmod);
1204 bsrc->
SetOrg().SetOrgname(*orgname);
1207 bsrc->
SetOrg().SetOrgname().SetMod().push_back(orgmod);
1209 CObjectInfo orgmod_oi(orgmod.GetPointer(), orgmod->GetTypeInfo());
1219 return dest_objs.size() - orig_size > 0;
1225 if (feat.
IsNull() || field_name.empty())
1233 size_t orig_size =
result.size();
1234 string field = field_name;
1236 field =
"satellite";
1239 field =
"mobile-element-type";
1245 CObjectInfo gbqual_oi((*gbq_it).GetPointer(), (*gbq_it)->GetTypeInfo());
1256 feat->
SetQual().push_back(new_gbqual);
1257 CObjectInfo gbqual_oi(new_gbqual.GetPointer(), new_gbqual->GetTypeInfo());
1262 return result.size() - orig_size > 0;
1267 if (field_name.empty())
1275 string field = field_name;
1277 field =
"satellite";
1280 field =
"mobile-element-type";
1286 CObjectInfo gbqual_oi((*gbq_it).GetPointer(), (*gbq_it)->GetTypeInfo());
1291 return (!
result.empty());
1294 bool IstRNAProductField(
const CSeq_feat& feat,
const string& field_name)
1308 return CreateNewGene(src_feat, scope);
1313 return CreateNewProtein(src_feat, scope);
1348 new_gene->SetLocation(*gene_loc);
1377 list<CMappedFeat> cds_feats;
1379 for (
auto& it : cds_feats) {
1380 if (it.IsSetProduct()) {
1418 if (!x_GetSourceFields(oi, index, src_objs))
1422 if (!x_GetDestFields(oi, ++index, dest_objs))
1425 const string& action_type = m_Args[++index]->GetString();
1426 string delimiter = (++index < m_Args.size()) ? m_Args[index]->GetString() :
kEmptyStr;
1431 if (src_feat && m_Args[1]->IsString() &&
NStr::EndsWith(m_Args[1]->GetString(),
"::product")) {
1433 for (
auto&& it : src_objs) {
1438 string src_val = x_GetSourceString(src);
1441 edit_feat->
SetData().SetRna().SetRnaProductName(src_val, remainder);
1442 m_QualsChangedCount++;
1446 ChangeFields(src_objs, dest_objs);
1449 if (m_QualsChangedCount) {
1450 if (!dest_objs.empty()) {
1453 m_DataIter->SetModified();
1455 log << m_DataIter->GetBestDescr() <<
": copied " << m_QualsChangedCount <<
" qualifiers";
1462 size_t arg_size =
m_Args.size();
1463 if (arg_size != 3 && arg_size != 4) {
1467 for (
size_t i = 0;
i < 2; ++
i) {
1476 for (
size_t i = 2;
i < arg_size; ++
i) {
1509 if (!src_feat || !scope)
1512 const string& dest_field =
m_Args[2]->GetString();
1513 if (dest_field.empty())
1525 bool changed =
false,
created =
false;
1528 if (!feat_list.empty() && feat_list.size() == 1) {
1530 dest_feat->
Assign(*feat_list.front());
1531 if (!SetFeatDestinationField(dest_feat, dest_field, dest_objs)) {
1539 dest_feat = CreateNewRelatedFeature(*src_feat, dest_field, *scope);
1540 if (!dest_feat)
return;
1541 if (!SetFeatDestinationField(dest_feat, dest_field, dest_objs)) {
1548 if ((*it)->IsSetData() && (*it)->GetData().IsProt()) {
1549 dest_feat->
SetData().SetProt().Assign((*it)->GetData().GetProt());
1550 edit_feat->
SetXref().erase(it);
1554 if (edit_feat->
GetXref().empty()) {
1561 bool update_mrna =
m_Args[index]->GetBool();
1562 const string& action_type =
m_Args[++index]->GetString();
1567 if (IstRNAProductField(*dest_feat, dest_field)) {
1568 for (
auto&& it : src_objs) {
1576 dest_feat->
SetData().SetRna().SetRnaProductName(src_val, remainder);
1590 if (changed && fh) {
1605 cmd->AddCommand(*upd_cmd);
1606 log <<
", " << message;
1614 cmd->AddCommand(*upd_cmd);
1615 log <<
", applied " + prot_product +
" to mRNA product name ";
1633 for (
size_t index = 1; index <
m_Args.size(); ++index) {
1656 if (!rna_feat || !scope)
1662 const string& src_feat =
m_Args[0]->GetString();
1663 const string& dest_feat =
m_Args[2]->GetString();
1664 if (src_feat ==
"rna" && src_feat == dest_feat)
1667 if ((src_feat !=
"rna" && src_feat !=
"gene") || (dest_feat !=
"rna" && dest_feat !=
"gene"))
1671 const string& action_type =
m_Args[index]->GetString();
1675 if (src_feat ==
"rna" && dest_feat ==
"gene") {
1681 const string dest_field =
m_Args[3]->GetString();
1685 bool changed =
false,
created =
false;
1688 if (!feat_list.empty() && feat_list.size() == 1) {
1690 dest_feat->
Assign(*feat_list.front());
1691 if (!SetFeatDestinationField(dest_feat, dest_field, dest_objs)) {
1699 dest_feat = CreateNewRelatedFeature(*rna_feat, dest_field, *scope);
1700 if (!dest_feat)
return;
1701 if (!SetFeatDestinationField(dest_feat, dest_field, dest_objs)) {
1711 if (changed && fh) {
1727 else if (src_feat ==
"gene" && dest_feat ==
"gene") {
1733 if (!feat_list.empty() && feat_list.size() == 1) {
1735 gene_feat->
Assign(*feat_list.front());
1766 else if (src_feat ==
"gene" && dest_feat ==
"rna") {
1771 if (!feat_list.empty() && feat_list.size() == 1) {
1773 gene_feat->
Assign(*feat_list.front());
1790 for (
auto&& it : src_objs) {
1798 edit_feat->
SetData().SetRna().SetRnaProductName(src_val, remainder);
1823 for (
size_t index = 1; index < 4; index += 2) {
1824 if (!(
m_Args[index]->IsString() ||
m_Args[index]->AreObjects() ||
m_Args[index]->IsRef()))
1842 if (!src_feat || !scope)
1846 const string& field_name =
m_Args[1]->GetString();
1852 const string& action_type =
m_Args[++index]->GetString();
1854 bool remove_field =
false;
1855 bool update_mrna =
false;
1856 size_t arg_nr =
m_Args.size();
1858 if (++index < arg_nr) {
1859 if (
m_Args[index]->IsString()) {
1861 if (++index < arg_nr) {
1862 remove_field =
m_Args[index]->GetBool();
1863 if (++index < arg_nr)
1864 update_mrna =
m_Args[index]->GetBool();
1867 else if (
m_Args[index]->IsBool()) {
1868 remove_field =
m_Args[index]->GetBool();
1869 if (++index < arg_nr)
1870 update_mrna =
m_Args[index]->GetBool();
1875 if (!newValue.empty()) {
1877 bool changed =
false,
created =
false;
1880 if (!feat_list.empty() && feat_list.size() == 1) {
1882 dest_feat->
Assign(*feat_list.front());
1883 if (!SetFeatDestinationField(dest_feat, field_name, objs)) {
1891 dest_feat = CreateNewRelatedFeature(*src_feat, field_name, *scope);
1892 if (!dest_feat)
return;
1893 if (!SetFeatDestinationField(dest_feat, field_name, objs)) {
1900 if ((*it)->IsSetData() && (*it)->GetData().IsProt()) {
1901 dest_feat->
SetData().SetProt().Assign((*it)->GetData().GetProt());
1902 edit_feat->
SetXref().erase(it);
1907 if (edit_feat->
GetXref().empty()) {
1913 vector<string> new_values;
1914 x_SetFields(objs, newValue, existing_text, new_values);
1920 for (
size_t i = 0;
i < new_values.size(); ++
i) {
1921 log <<
": set '" << new_values[
i] <<
"' as a new value";
1924 if (changed && fh) {
1931 cmd->AddCommand(*upd_cmd);
1932 log <<
", applied " + prot_product +
" to mRNA product name ";
1945 cmd->AddCommand(*upd_cmd);
1946 log <<
", " << message;
1955 else if (remove_field) {
1959 if (!feat_list.empty() && feat_list.size() == 1) {
1961 dest_feat->
Assign(*feat_list.front());
1962 if (!GetFeatDestinationField(dest_feat, field_name, objs)) {
1968 for (
auto& it : objs) {
1978 cleanup.BasicCleanup(*dest_feat);
1988 cmd->AddCommand(*upd_cmd);
1989 log <<
", " << message;
2002 size_t arg_nr =
m_Args.size();
2003 if (arg_nr < 4 && arg_nr > 7) {
2009 for (; index < 4; ++index) {
2010 if (!
m_Args[index]->IsString())
2014 if (index < arg_nr && (!
m_Args[index]->IsString() && !
m_Args[index]->IsBool()))
return false;
2015 if (++index < arg_nr && !
m_Args[index]->IsBool())
return false;
2016 if (++index < arg_nr && !
m_Args[index]->IsBool())
return false;
2031 if (!src_feat || !scope)
2038 bool case_sensitive =
m_Args[++index]->GetBool();
2039 bool is_regex = (++index <
m_Args.size()) ?
m_Args[index]->GetBool() :
false;
2042 const string& field_name =
m_Args[1]->GetString();
2049 if (!feat_list.empty() && feat_list.size() == 1) {
2051 dest_feat->
Assign(*feat_list.front());
2052 if (!GetFeatDestinationField(dest_feat, field_name, objs)) {
2069 repl_txt.assign(
"''");
2071 log <<
" with " << repl_txt;
2081 for (
size_t index = 2; index < 4; index++) {
2087 if (
m_Args.size() == 7) {
2102 void CMacroFunction_RmvRelFeatQual::TheFunction()
2106 CRef<CScope> scope = m_DataIter->GetScopedObject().scope;
2107 if (!src_feat || !scope)
2111 const string& field_name = m_Args[1]->GetString();
2118 if (!feat_list.empty() && feat_list.size() == 1) {
2120 dest_feat->
Assign(*feat_list.front());
2121 if (!GetFeatDestinationField(dest_feat, field_name, objs)) {
2127 for (
auto& it : objs) {
2129 m_QualsChangedCount++;
2134 if (m_QualsChangedCount) {
2137 cleanup.BasicCleanup(*dest_feat);
2141 m_DataIter->RunCommand(
cmd, m_CmdComposite);
2144 log << m_DataIter->GetBestDescr() <<
": removed " << m_QualsChangedCount <<
" qualifiers";
2149 bool CMacroFunction_RmvRelFeatQual::x_ValidArguments()
const
2151 if (m_Args.size() != 2)
2155 return (m_Args[0]->IsString() && m_Args[1]->IsString());
2170 CRef<CScope> scope = m_DataIter->GetScopedObject().scope;
2171 if (!src_feat || !scope)
2175 const string& field_name = m_Args[1]->GetString();
2183 if (!feat_list.empty() && feat_list.size() == 1) {
2185 dest_feat->
Assign(*feat_list.front());
2186 if (!GetFeatDestinationField(dest_feat, field_name, objs)) {
2193 x_RmvOutsideFields(objs, *options);
2194 if (m_QualsChangedCount) {
2198 m_DataIter->RunCommand(
cmd, m_CmdComposite);
2202 log << m_DataIter->GetBestDescr() <<
": removed text outside string in " << m_QualsChangedCount <<
" qualifiers";
2204 bool update_mrna = (m_Args.size() == 11) ? m_Args[10]->GetBool() :
false;
2207 CRef<CScope> scope = m_DataIter->GetScopedObject().scope;
2211 m_DataIter->RunCommand(
cmd, m_CmdComposite);
2212 log <<
", applied " + prot_product +
" to mRNA product name ";
2235 _ASSERT(!src_objs.empty() && !dest_objs.empty());
2236 CMQueryNodeValue::TObs::iterator src_it = src_objs.begin();
2237 CMQueryNodeValue::TObs::iterator dest_it = dest_objs.begin();
2239 while (src_it != src_objs.end()) {
2246 CObjectInfo new_oi(dest_it->field.AddNewElement());
2249 for (
auto& it : src_prim_objs) {
2255 if (dest_it == dest_objs.end()) {
2263 if (index >=
m_Args.size())
2281 return (!
result.empty());
2290 const string& dest_field =
m_Args[index]->GetString();
2292 bool valid = GetDestinationObjects(
object, oi, dest_field,
result);
2293 if (valid &&
result.empty())
2331 if (src.
GetName() ==
"Dbtag") {
2334 tag->GetLabel(&src_val);
2356 if (!x_GetSourceFields(oi, index, src_objs))
2360 if (!x_GetDestFields(oi, ++index, dest_objs))
2363 const string& capitalization = m_Args[++index]->GetString();
2367 const string& action_type = m_Args[++index]->GetString();
2368 string delimiter = (++index < m_Args.size()) ? m_Args[index]->GetString() :
kEmptyStr;
2374 if (src_feat && m_Args[1]->IsString() &&
NStr::EndsWith(m_Args[1]->GetString(),
"::product")) {
2376 for (
auto&& it : src_objs) {
2381 string src_val = x_GetSourceString(src);
2384 edit_feat->
SetData().SetRna().SetRnaProductName(src_val, remainder);
2385 m_QualsChangedCount++;
2389 ChangeFields(src_objs, dest_objs);
2392 if (m_QualsChangedCount) {
2393 if (!dest_objs.empty()) {
2396 m_DataIter->SetModified();
2398 log << m_DataIter->GetBestDescr() <<
": converted " << m_QualsChangedCount <<
" qualifiers";
2430 size_t as =
m_Args.size();
2431 if (!(as == 5 || as == 6)) {
2435 for (
size_t i = 0;
i < 2; ++
i) {
2472 size_t src_index = 0, dest_index = 1;
2475 || m_Args.size() == 4) {
2480 bool src_set = x_DoFieldsExist(oi, src_objs, src_index);
2481 bool dest_set = x_DoFieldsExist(oi, dest_objs, dest_index);
2483 if (!src_set && !dest_set)
2487 bool is_gene_suppressed_before =
false;
2488 bool is_gene_suppressed_after =
false;
2493 is_gene_suppressed_before = gene_xref && gene_xref->
IsSuppressed();
2497 x_SetFields(oi, src_objs, src_index);
2500 x_SetFields(oi, dest_objs, dest_index);
2503 if (src_set && dest_set) {
2504 CMQueryNodeValue::TObs::iterator src_it = src_objs.begin();
2505 CMQueryNodeValue::TObs::iterator dest_it = dest_objs.begin();
2507 while (src_it != src_objs.end() && dest_it != dest_objs.end()) {
2514 CObjectInfo new_oi(dest_it->field.AddNewElement());
2517 x_SwapFields(src_prim_objs.front().field, dest_prim_objs.front().field);
2525 else if (!src_set) {
2527 x_CopyFields(dest_objs, src_objs);
2538 else if (!dest_set) {
2540 x_CopyFields(src_objs, dest_objs);
2555 cleanup.BasicCleanup(*seq_feat);
2559 if (!is_gene_suppressed_before && is_gene_suppressed_after)
2567 bsrc->
SetOrg().ResetDb();
2571 if (m_QualsChangedCount) {
2572 m_DataIter->SetModified();
2574 log << m_DataIter->GetBestDescr() <<
": swapped " << m_QualsChangedCount <<
" qualifiers";
2585 for (
auto& it :
m_Args) {
2597 if (index >=
m_Args.size())
2611 return (!
result.empty());
2616 if (index >=
m_Args.size())
2628 return (!
result.empty());
2633 if (field_name.empty())
2659 orgname->
SetMod().push_back(orgmod);
2660 bsrc->
SetOrg().SetOrgname(*orgname);
2663 orgname =
Ref(&(bsrc->
SetOrg().SetOrgname()));
2664 orgname->
SetMod().push_back(orgmod);
2678 if (field_name.empty())
2686 feat->
SetQual().push_back(new_gbqual);
2747 bool swapped =
false;
2824 CMQueryNodeValue::TObs::iterator src_it = src_objs.begin();
2825 CMQueryNodeValue::TObs::iterator dest_it = dest_objs.begin();
2827 while (src_it != src_objs.end() && dest_it != dest_objs.end()) {
2835 CObjectInfo new_oi(dest_it->field.AddNewElement());
2838 x_CopyFields(src_prim_objs.front().field, dest_prim_objs.front().field);
2876 CRef<CScope> scope = m_DataIter->GetScopedObject().scope;
2877 if (!src_feat || !scope)
2880 size_t src_index = 0, dest_index = 1;
2881 if (m_Args.size() == 5) {
2884 if (m_Args[dest_index]->GetString().empty() || m_Args[dest_index + 1]->GetString().empty())
2887 const string& dest_feattype = m_Args[dest_index]->GetString();
2888 const string& dest_field = m_Args[dest_index + 1]->GetString();
2890 m_Args[src_index]->GetString() :
kEmptyStr;
2893 m_ConstDestFeat.Reset(
nullptr);
2894 m_EditDestFeat.Reset(
nullptr);
2895 m_CreatedFeat.Reset(
nullptr);
2903 bool src_set = x_DoFieldsExist(oi, src_objs, src_index);
2904 if (IstRNAProductField(*src_feat, src_field)) {
2907 bool dest_set = x_DoDestFeatFieldsExist(*src_feat, dest_objs, dest_feattype, dest_field);
2909 if (!src_set && !dest_set)
2913 x_SetFields(oi, src_objs, src_index);
2916 x_SetOrCreateDestFeatFields(*src_feat, dest_objs, dest_index + 1);
2919 if (src_set && dest_set) {
2920 CMQueryNodeValue::TObs::iterator src_it = src_objs.begin();
2921 CMQueryNodeValue::TObs::iterator dest_it = dest_objs.begin();
2923 while (src_it != src_objs.end() && dest_it != dest_objs.end()) {
2930 CObjectInfo new_oi(dest_it->field.AddNewElement());
2933 x_SwapFields(src_prim_objs.front().field, dest_prim_objs.front().field);
2939 if (m_EditDestFeat && IstRNAProductField(*m_EditDestFeat, dest_field)) {
2940 while (src_it != src_objs.end()) {
2944 string dest_str = m_EditDestFeat->GetData().GetRna().GetRnaProductName();
2951 m_EditDestFeat->SetData().SetRna().SetRnaProductName(
tmp, remainder);
2952 m_QualsChangedCount++;
2957 else if (IstRNAProductField(*src_feat, src_field)) {
2958 while (dest_it != dest_objs.end()) {
2963 CObjectInfo new_oi(dest_it->field.AddNewElement());
2974 seq_feat->
SetData().SetRna().SetRnaProductName(
tmp, remainder);
2975 m_QualsChangedCount++;
2981 else if (!src_set) {
2983 x_CopyFields(dest_objs, src_objs);
2985 if (IstRNAProductField(*seq_feat, src_field)) {
2986 CMQueryNodeValue::TObs::iterator dest_it = dest_objs.begin();
2988 while (dest_it != dest_objs.end()) {
3002 seq_feat->
SetData().SetRna().SetRnaProductName(dest_val, remainder);
3003 m_QualsChangedCount++;
3008 if (m_EditDestFeat && IstRNAProductField(*m_EditDestFeat, dest_field)) {
3009 CMQueryNodeValue::TObs::iterator src_it = src_objs.begin();
3011 while (src_it != src_objs.end()) {
3015 string rna_str = m_EditDestFeat->GetData().GetRna().GetRnaProductName();
3018 m_QualsChangedCount++;
3024 if (m_EditDestFeat && IstRNAProductField(*m_EditDestFeat, dest_field)) {
3026 m_EditDestFeat->SetData().SetRna().SetRnaProductName(
kEmptyStr, remainder);
3030 if (it->parent.GetName() ==
"Gb-qual" && m_EditDestFeat) {
3031 const string& qual_name = m_Args[m_Args.size() - 2]->GetString();
3032 m_EditDestFeat->RemoveQualifier(qual_name);
3039 else if (!dest_set) {
3041 x_CopyFields(src_objs, dest_objs);
3043 if (m_EditDestFeat && IstRNAProductField(*m_EditDestFeat, dest_field)) {
3044 CMQueryNodeValue::TObs::iterator src_it = src_objs.begin();
3046 while (src_it != src_objs.end()) {
3060 m_EditDestFeat->SetData().SetRna().SetRnaProductName(src_val, remainder);
3061 m_QualsChangedCount++;
3066 if (IstRNAProductField(*seq_feat, src_field)) {
3067 CMQueryNodeValue::TObs::iterator dest_it = dest_objs.begin();
3069 while (dest_it != dest_objs.end()) {
3076 m_QualsChangedCount++;
3082 if (IstRNAProductField(*seq_feat, src_field)) {
3091 bool update_mrna = (m_Args.back()->GetDataType() ==
CMQueryNodeValue::eBool) ? m_Args.back()->GetBool() :
false;
3094 cleanup.BasicCleanup(*seq_feat);
3095 if (m_EditDestFeat) {
3096 cleanup.BasicCleanup(*m_EditDestFeat);
3098 else if (m_CreatedFeat) {
3099 cleanup.BasicCleanup(*m_CreatedFeat);
3102 if (m_QualsChangedCount) {
3103 m_DataIter->SetModified();
3105 log << m_DataIter->GetBestDescr() <<
": swapped " << m_QualsChangedCount <<
" qualifiers";
3108 if (m_ConstDestFeat && m_EditDestFeat) {
3116 cmd->AddCommand(*upd_cmd);
3117 log <<
", " << message;
3121 else if (m_CreatedFeat) {
3129 cmd->AddCommand(*upd_cmd);
3130 log <<
", " << message;
3135 m_DataIter->RunCommand(
cmd, m_CmdComposite);
3143 m_DataIter->RunCommand(upd_cmd, m_CmdComposite);
3144 log <<
", applied " + prot_product +
" to mRNA product name ";
3157 if (!feat_list.empty() && feat_list.size() == 1) {
3164 return (!
m_EditDestFeat->GetData().GetRna().GetRnaProductName().empty());
3168 return (!
result.empty());
3173 if (index >=
m_Args.size())
3175 const string& dest_field =
m_Args[index]->GetString();
3193 if ((*it)->IsSetData() && (*it)->GetData().IsProt()) {
3194 m_CreatedFeat->SetData().SetProt().Assign((*it)->GetData().GetProt());
3195 edit_feat->
SetXref().erase(it);
3199 if (edit_feat->
GetXref().empty()) {
3212 bool first_ok = (
m_Args[0]->IsString() ||
m_Args[0]->AreObjects() ||
m_Args[0]->IsRef());
3216 for (
size_t index = 1; index <
m_Args.size() - 1; ++index) {
3217 if (!
m_Args[index]->IsString()) {
3221 return (
m_Args.back()->IsBool());
3239 if (!src_feat || !scope)
3242 const string& dest_field =
m_Args[2]->GetString();
3243 if (dest_field.empty())
3255 bool changed =
false,
created =
false;
3258 if (!feat_list.empty() && feat_list.size() == 1) {
3260 dest_feat->
Assign(*feat_list.front());
3261 if (!SetFeatDestinationField(dest_feat, dest_field, dest_objs)) {
3269 dest_feat = CreateNewRelatedFeature(*src_feat, dest_field, *scope);
3270 if (!dest_feat)
return;
3271 if (!SetFeatDestinationField(dest_feat, dest_field, dest_objs)) {
3278 if ((*it)->IsSetData() && (*it)->GetData().IsProt()) {
3279 dest_feat->
SetData().SetProt().Assign((*it)->GetData().GetProt());
3280 edit_feat->
SetXref().erase(it);
3284 if (edit_feat->
GetXref().empty()) {
3291 const string& capitalization =
m_Args[index]->GetString();
3295 bool update_mrna =
m_Args[++index]->GetBool();
3296 const string& action_type =
m_Args[++index]->GetString();
3302 if (IstRNAProductField(*dest_feat, dest_field)) {
3303 for (
auto&& it : src_objs) {
3311 dest_feat->
SetData().SetRna().SetRnaProductName(src_val, remainder);
3325 if (changed && fh) {
3340 cmd->AddCommand(*upd_cmd);
3341 log <<
", " << message;
3349 cmd->AddCommand(*upd_cmd);
3350 log <<
", applied " + prot_product +
" to mRNA product name ";
3367 for (
size_t index = 1; index <
m_Args.size(); ++index) {
3389 if (!rna_feat || !scope)
3395 const string& src_feat =
m_Args[0]->GetString();
3396 const string& dest_feat =
m_Args[2]->GetString();
3397 if (src_feat ==
"rna" && src_feat == dest_feat)
3400 if ((src_feat !=
"rna" && src_feat !=
"gene") || (dest_feat !=
"rna" && dest_feat !=
"gene"))
3404 const string& capitalization =
m_Args[index]->GetString();
3408 const string& action_type =
m_Args[++index]->GetString();
3413 if (src_feat ==
"rna" && dest_feat ==
"gene") {
3419 const string dest_field =
m_Args[3]->GetString();
3423 bool changed =
false,
created =
false;
3426 if (!feat_list.empty() && feat_list.size() == 1) {
3428 dest_feat->
Assign(*feat_list.front());
3429 if (!SetFeatDestinationField(dest_feat, dest_field, dest_objs)) {
3437 dest_feat = CreateNewRelatedFeature(*rna_feat, dest_field, *scope);
3438 if (!dest_feat)
return;
3439 if (!SetFeatDestinationField(dest_feat, dest_field, dest_objs)) {
3449 if (changed && fh) {
3465 else if (src_feat ==
"gene" && dest_feat ==
"gene") {
3471 if (!feat_list.empty() && feat_list.size() == 1) {
3473 gene_feat->
Assign(*feat_list.front());
3504 else if (src_feat ==
"gene" && dest_feat ==
"rna") {
3509 if (!feat_list.empty() && feat_list.size() == 1) {
3511 gene_feat->
Assign(*feat_list.front());
3528 for (
auto&& it : src_objs) {
3536 edit_feat->
SetData().SetRna().SetRnaProductName(src_val, remainder);
3555 auto nr_args =
m_Args.size();
3556 if (nr_args < 7 || nr_args > 8)
3562 for (
size_t index = 1; index < 4; index += 2) {
3563 if (!(
m_Args[index]->IsString() ||
m_Args[index]->AreObjects() ||
m_Args[index]->IsRef()))
3567 for (
size_t index = 4; index < nr_args; ++index) {
3568 if (index != 5 && !
m_Args[index]->IsString())
3571 return (
m_Args[5]->IsBool());
3592 const string& capitalization =
m_Args[++index]->GetString();
3593 const string& action_type =
m_Args[++index]->GetString();
3603 for (
auto&& it : src_objs) {
3611 edit_feat->
SetData().SetRna().SetRnaProductName(src_val, remainder);
3619 if (!dest_objs.empty()) {
3656 size_t as =
m_Args.size();
3657 if (as < 1 || as > 5) {
3660 for (
size_t i = 0;
i < 2; ++
i) {
3664 for (
size_t index = 2; index < as; ++index) {
3665 if (!
m_Args[index]->IsString()) {
3685 if (!src_feat || !scope)
3688 const string& dest_field =
m_Args[2]->GetString();
3689 if (dest_field.empty())
3701 bool changed =
false,
created =
false;
3704 if (!feat_list.empty() && feat_list.size() == 1) {
3706 dest_feat->
Assign(*feat_list.front());
3707 if (!SetFeatDestinationField(dest_feat, dest_field, dest_objs)) {
3715 dest_feat = CreateNewRelatedFeature(*src_feat, dest_field, *scope);
3716 if (!dest_feat)
return;
3717 if (!SetFeatDestinationField(dest_feat, dest_field, dest_objs)) {
3724 if ((*it)->IsSetData() && (*it)->GetData().IsProt()) {
3725 dest_feat->
SetData().SetProt().Assign((*it)->GetData().GetProt());
3726 edit_feat->
SetXref().erase(it);
3730 if (edit_feat->
GetXref().empty()) {
3737 const string& capitalization =
m_Args[index]->GetString();
3738 bool update_mrna =
m_Args[++index]->GetBool();
3739 const string& action_type =
m_Args[++index]->GetString();
3745 if (IstRNAProductField(*dest_feat, dest_field)) {
3746 for (
auto&& it : src_objs) {
3754 dest_feat->
SetData().SetRna().SetRnaProductName(src_val, remainder);
3768 if (changed && fh) {
3783 cmd->AddCommand(*upd_cmd);
3784 log <<
", " << message;
3792 cmd->AddCommand(*upd_cmd);
3793 log <<
", applied " + prot_product +
" to mRNA product name ";
3814 for (
size_t index = 1; index <
m_Args.size(); ++index) {
3836 if (!rna_feat || !scope)
3842 const string& src_feat =
m_Args[0]->GetString();
3843 const string& dest_feat =
m_Args[2]->GetString();
3844 if (src_feat ==
"rna" && src_feat == dest_feat)
3847 if ((src_feat !=
"rna" && src_feat !=
"gene") || (dest_feat !=
"rna" && dest_feat !=
"gene"))
3851 const string& capitalization =
m_Args[index]->GetString();
3852 const string& action_type =
m_Args[++index]->GetString();
3857 if (src_feat ==
"rna" && dest_feat ==
"gene") {
3863 const string dest_field =
m_Args[3]->GetString();
3867 bool changed =
false,
created =
false;
3870 if (!feat_list.empty() && feat_list.size() == 1) {
3872 dest_feat->
Assign(*feat_list.front());
3873 if (!SetFeatDestinationField(dest_feat, dest_field, dest_objs)) {
3881 dest_feat = CreateNewRelatedFeature(*rna_feat, dest_field, *scope);
3882 if (!dest_feat)
return;
3883 if (!SetFeatDestinationField(dest_feat, dest_field, dest_objs)) {
3893 if (changed && fh) {
3909 else if (src_feat ==
"gene" && dest_feat ==
"gene") {
3915 if (!feat_list.empty() && feat_list.size() == 1) {
3917 gene_feat->
Assign(*feat_list.front());
3948 else if (src_feat ==
"gene" && dest_feat ==
"rna") {
3952 if (!feat_list.empty() && feat_list.size() == 1) {
3954 gene_feat->
Assign(*feat_list.front());
3971 for (
auto&& it : src_objs) {
3979 edit_feat->
SetData().SetRna().SetRnaProductName(src_val, remainder);
4004 for (
size_t index = 1; index < 4; index += 2) {
4005 if (!(
m_Args[index]->IsString() ||
m_Args[index]->AreObjects() ||
m_Args[index]->IsRef()))
4008 for (
size_t index = 4; index <
m_Args.size(); ++index) {
4009 if (!
m_Args[index]->IsString())
4034 string text_portion = parsed_obj.
GetString();
4035 if (text_portion.empty()) {
4044 const string& dest_field =
m_Args[index]->GetString();
4046 GetDestinationObjects(obj, oi, dest_field, dest_objs);
4049 dest_objs =
m_Args[index]->GetObjects();
4055 if (dest_objs.empty()) {
4059 const string& capitalization =
m_Args[++index]->GetString();
4060 const string& action_type =
m_Args[++index]->GetString();
4086 CObjectInfo new_oi(dest_objs.front().field.AddNewElement());
4104 size_t as =
m_Args.size();
4105 if (as != 4 && as != 5) {
4120 for (
size_t index = 2; index < as; ++index) {
4139 if (!src_feat || !scope)
4150 string text_portion = parsed_obj.
GetString();
4151 if (text_portion.empty()) {
4155 const string& dest_field =
m_Args[2]->GetString();
4156 if (dest_field.empty())
4163 bool changed =
false,
created =
false;
4167 if (!feat_list.empty() && feat_list.size() == 1) {
4169 dest_feat->
Assign(*feat_list.front());
4170 if (!SetFeatDestinationField(dest_feat, dest_field, dest_objs)) {
4178 dest_feat = CreateNewRelatedFeature(*src_feat, dest_field, *scope);
4179 if (!dest_feat)
return;
4180 if (!SetFeatDestinationField(dest_feat, dest_field, dest_objs)) {
4187 if ((*it)->IsSetData() && (*it)->GetData().IsProt()) {
4188 dest_feat->
SetData().SetProt().Assign((*it)->GetData().GetProt());
4189 edit_feat->
SetXref().erase(it);
4193 if (edit_feat->
GetXref().empty()) {
4200 const string& capitalization =
m_Args[index]->GetString();
4201 bool update_mrna =
m_Args[++index]->GetBool();
4202 const string& action_type =
m_Args[++index]->GetString();
4210 if (IstRNAProductField(*dest_feat, dest_field)) {
4212 dest_feat->
SetData().SetRna().SetRnaProductName(text_portion, remainder);
4224 if (changed && fh) {
4241 log <<
", " << message;
4257 for (
size_t index = 1; index <
m_Args.size(); ++index) {
4276 CRef<CScope> scope = m_DataIter->GetScopedObject().scope;
4277 if (!scope || !
object)
4284 string text_portion;
4289 const string& field = m_Args[0]->GetString();
4294 res_oi = m_Args[index]->GetObjects();
4295 if (!res_oi.empty()) {
4305 if (!res_oi.empty()) {
4318 if (text_portion.empty())
4321 x_SetFieldType(m_Args[++index]->GetString());
4322 string fieldname = (m_Type == eFieldValue) ? m_Args[++index]->GetString() :
kEmptyStr;
4323 if (m_Type == eFieldError) {
4324 NCBI_THROW(
CMacroExecException, eWrongArguments,
"Wrong structured comment fieldname is given (consider replacing it with either 'fieldvalue', 'dbname' or 'fieldname'");
4327 string capitalization, action_type;
4328 if (++index < m_Args.size()) {
4329 capitalization = m_Args[index]->GetString();
4331 if (++index < m_Args.size()) {
4332 action_type = m_Args[index]->GetString();
4334 if (capitalization.empty() || action_type.empty()) {
4338 string delimiter = (++index < m_Args.size()) ? m_Args[index]->GetString() :
kEmptyStr;
4352 for ( ; strcomm_it; ++strcomm_it) {
4357 const string kPrefix =
"StructuredCommentPrefix";
4358 const string kSuffix =
"StructuredCommentSuffix";
4362 new_desc->
Assign(*strcomm_it);
4367 if (m_Type == eFieldValue) {
4368 user_object.
AddField(fieldname, text_portion);
4369 m_QualsChangedCount++;
4373 if (m_Type == eFieldValue) {
4374 if (user_object.
HasField(fieldname)) {
4379 user_field.
SetData().SetStr(orig_val);
4380 m_QualsChangedCount++;
4386 user_object.
AddField(fieldname, text_portion);
4387 m_QualsChangedCount++;
4390 else if (m_Type == eDbName) {
4394 else if (m_Type == eFieldName) {
4402 user_field.
SetLabel().SetStr(orig_val);
4403 m_QualsChangedCount++;
4409 if (m_QualsChangedCount) {
4415 cmd->AddCommand(*ecmd);
4431 user_object.
AddField(fieldname, text_portion);
4432 m_QualsChangedCount++;
4437 m_QualsChangedCount++;
4441 m_QualsChangedCount++;
4447 if (m_QualsChangedCount) {
4454 m_DataIter->RunCommand(
cmd, m_CmdComposite);
4457 string msg =
"parsing text to structured comment ";
4460 msg +=
"field '" + fieldname +
"'";
4463 msg +=
"database name";
4471 report[msg] = m_QualsChangedCount;
4473 x_LogChangedQuals(fnc_log);
4485 for (
size_t index = 1; index <
m_Args.size(); ++index) {
4526 const string& field =
m_Args[0]->GetString();
4537 res_oi =
m_Args[0]->GetObjects();
4544 if (res_oi.empty())
return;
4555 string parsed_text = options->GetSelectedText(full_text);
4558 if (options->ShouldRemoveFromParsed()) {
4562 if (desc->IsTitle()) {
4563 string orig_val = desc->GetTitle();
4564 options->RemoveSelectedText(orig_val);
4565 if (!orig_val.empty()) {
4566 desc->SetTitle() = orig_val;
4570 cmd->AddCommand(*chg_cmd);
4577 else if (!res_oi.empty()) {
4585 options->RemoveSelectedText(orig_val);
4586 if (orig_val.empty()) {
4606 size_t as =
m_Args.size();
4607 if (as < 7 || as > 10) {
4617 for (
size_t i = 4;
i < as; ++
i) {
4627 if (bsh && bsh.
IsAa()) {
4633 if (!bsh)
return false;
4637 if (title_ci && !title_ci->
GetTitle().empty()) {
4639 new_desc->
Assign(*title_ci);
4653 if (!user.
GetData().empty()) {
4684 const string& left_del =
m_Args[start_index]->GetString();
4686 options->SetStartDigits();
4689 options->SetStartLetters();
4692 options->SetStartText(left_del);
4694 options->SetIncludeStart(
m_Args[++start_index]->GetBool());
4696 const string& right_del =
m_Args[++start_index]->GetString();
4698 options->SetStopDigits();
4701 options->SetStopLetters();
4704 options->SetStopText(right_del);
4706 options->SetIncludeStop(
m_Args[++start_index]->GetBool());
4708 options->SetCaseInsensitive(!
m_Args[++start_index]->GetBool());
4709 options->SetWholeWord(
m_Args[++start_index]->GetBool());
4711 auto nr_args =
m_Args.size();
4712 if (++start_index < nr_args) {
4713 options->SetShouldRemove(
m_Args[start_index]->GetBool());
4715 if (++start_index < nr_args) {
4716 options->SetShouldRmvBeforePattern(
m_Args[start_index]->GetBool());
4718 if (++start_index < nr_args) {
4719 options->SetShouldRmvAfterPattern(
m_Args[start_index]->GetBool());
4741 if (!rna_feat || !scope)
4747 const string& src_feat =
m_Args[0]->GetString();
4748 if (src_feat !=
"gene")
4755 if (!feat_list.empty() && feat_list.size() == 1) {
4757 gene_feat->
Assign(*feat_list.front());
4761 if (
m_Args[index]->IsString()) {
4765 else if (
m_Args[index]->AreObjects()) {
4766 res_oi =
m_Args[index]->GetObjects();
4768 else if (
m_Args[index]->IsRef()) {
4788 string parsed_text = options->GetSelectedText(full_text);
4791 if (!parsed_text.empty() && options->ShouldRemoveFromParsed()) {
4799 options->RemoveSelectedText(orig_val);
4800 if (orig_val.empty()) {
4819 size_t as =
m_Args.size();
4820 if (as < 8 || as > 11) {
4830 for (
size_t i = 5;
i < as; ++
i) {
4842 void CMacroFunction_LocalID::TheFunction()
4850 if (!user.
GetData().empty()) {
4867 if (m_Result->IsNotSet()) {
4871 if (m_Result->IsNotSet()) {
4878 bool CMacroFunction_LocalID::x_ValidArguments()
const
4880 return (m_Args.empty());
4903 res_oi = m_Args[0]->GetObjects();
4906 x_GetObjectsFromRef(res_oi, 0);
4909 if (res_oi.empty()) {
4915 m_QualsChangedCount++;
4919 if (m_QualsChangedCount) {
4921 m_DataIter->SetModified();
4923 log << m_DataIter->GetBestDescr() <<
": set new value to " << m_QualsChangedCount <<
" qualifiers";
4933 if (
m_Args.size() != 2 || !first_ok)
4936 if (!
m_Args[1]->IsSimpleType()) {
4960 CRef<CScope> scope = m_DataIter->GetScopedObject().scope;
4961 if (!scope || !bseq || bseq->
IsAa())
4965 const string& dblink = m_Args[index]->GetString();
4967 const string& existing_text_option = m_Args[++index]->GetString();
4969 bool remove_field =
false;
4970 x_GetOptionalArgs(
delimiter, remove_field, index);
4975 if (!newValue.empty()) {
4976 vector<pair<CSeqdesc_CI, CRef<CSeqdesc>>> changed_descs;
4982 if (desc_it->GetUser().GetType().IsStr() && desc_it->GetUser().GetType().GetStr() ==
"DBLink") {
4984 new_desc->
Assign(*desc_it);
4986 bool found_user_field =
false;
4990 found_user_field =
true;
4994 m_QualsChangedCount++;
5002 m_QualsChangedCount++;
5006 for (
auto& it : field.
SetData().SetStrs()) {
5007 string orig_value = it;
5010 m_QualsChangedCount++;