diff --git a/src/matcher/subfield_list_matcher.rs b/src/matcher/subfield_list_matcher.rs index c62779b52..cc38d96de 100644 --- a/src/matcher/subfield_list_matcher.rs +++ b/src/matcher/subfield_list_matcher.rs @@ -5,7 +5,7 @@ use nom::branch::alt; use nom::bytes::complete::tag; use nom::character::complete::{char, digit1}; use nom::combinator::{all_consuming, cut, map, map_res}; -use nom::multi::many0; +use nom::multi::many1; use nom::sequence::{preceded, terminated, tuple}; use nom::Finish; @@ -240,7 +240,7 @@ fn parse_subfield_list_matcher_composite_and( ws(parse_subfield_list_matcher_cardinality), ws(parse_subfield_list_matcher_not), )), - many0(preceded( + many1(preceded( ws(tag("&&")), alt(( ws(parse_subfield_list_matcher_group), @@ -268,7 +268,7 @@ fn parse_subfield_list_matcher_composite_or( ws(parse_subfield_list_matcher_cardinality), ws(parse_subfield_list_matcher_not), )), - many0(preceded( + many1(preceded( ws(tag("||")), cut(alt(( ws(parse_subfield_list_matcher_group), @@ -299,9 +299,9 @@ pub(crate) fn parse_subfield_list_matcher( i: &[u8], ) -> ParseResult { alt(( + parse_subfield_list_matcher_composite, parse_subfield_list_matcher_group, parse_subfield_list_matcher_not, - parse_subfield_list_matcher_composite, parse_subfield_list_matcher_singleton, parse_subfield_list_matcher_cardinality, ))(i) diff --git a/tests/pica/filter.rs b/tests/pica/filter.rs index 8f6b70938..af29da42e 100644 --- a/tests/pica/filter.rs +++ b/tests/pica/filter.rs @@ -644,6 +644,32 @@ fn pica_filter_and_connective() -> TestResult { predicate::path::eq_file(Path::new("tests/data/121169502.dat")); assert.success().stdout(expected); + // see https://github.com/deutsche-nationalbibliothek/pica-rs/issues/443 + let mut cmd = Command::cargo_bin("pica")?; + let assert = cmd + .arg("filter") + .arg("--skip-invalid") + .arg("003@{ (0 == '121169502') && 0 == '121169502'}") + .arg("tests/data/121169502.dat") + .assert(); + + let expected = + predicate::path::eq_file(Path::new("tests/data/121169502.dat")); + assert.success().stdout(expected); + + // see https://github.com/deutsche-nationalbibliothek/pica-rs/issues/443 + let mut cmd = Command::cargo_bin("pica")?; + let assert = cmd + .arg("filter") + .arg("--skip-invalid") + .arg("003@{ (0 == '121169502') && (0 == '121169502')}") + .arg("tests/data/121169502.dat") + .assert(); + + let expected = + predicate::path::eq_file(Path::new("tests/data/121169502.dat")); + assert.success().stdout(expected); + Ok(()) } @@ -738,6 +764,32 @@ fn pica_filter_or_connective() -> TestResult { .assert(); assert.success().stdout(predicate::str::is_empty()); + // see https://github.com/deutsche-nationalbibliothek/pica-rs/issues/443 + let mut cmd = Command::cargo_bin("pica")?; + let assert = cmd + .arg("filter") + .arg("--skip-invalid") + .arg("003@{(0 == '121169502') || 0 == '121169502'}") + .arg("tests/data/121169502.dat") + .assert(); + + let expected = + predicate::path::eq_file(Path::new("tests/data/121169502.dat")); + assert.success().stdout(expected); + + // see https://github.com/deutsche-nationalbibliothek/pica-rs/issues/443 + let mut cmd = Command::cargo_bin("pica")?; + let assert = cmd + .arg("filter") + .arg("--skip-invalid") + .arg("003@{(0 == '121169502') || (0 == '121169502')}") + .arg("tests/data/121169502.dat") + .assert(); + + let expected = + predicate::path::eq_file(Path::new("tests/data/121169502.dat")); + assert.success().stdout(expected); + Ok(()) }