package SLUB::LZA::Rosetta::TA::Command::search; use strict; use warnings; use feature qw(say); use SLUB::LZA::Rosetta::TA -command; sub abstract {"searches Rosetta based Archival Information System";} my $description=<<"DESCR"; Searches a Rosetta-based AIS for descriptive oder source metadata on behalf of the Technical Analyst. Returns SRU-response including dc-records. Only the first 10 matches will be presented by default. Examples: * Is this dc identifier in Archiv? $0 count -d SLUB:LZA:Kitodo:kitodo:422766 * Which IE PID has this dc identifier? $0 search -d SLUB:LZA:Kitodo:kitodo:422766 * Which IE PID are public domain? $0 search -s publicdomain * Which IE PID are copyrighted? $0 search -s copyrighted * Which IEs were modified in 2021-05-31? $0 search -m 2021-05-31 Which IEs have at least one invalid file? $0 search --with-invalid-files * Which IEs with mkv-files are in archive? $0 search --with-format=fmt/569 * Which IEs have at least one file without virus check? $0 search --with-missed-viruscheck DESCR sub description { "$description" } sub opt_spec { return( ["verbose|v" => "enable verbose output"], ["datemode" => hidden => {one_of => [ ["creationdate|c=s" => "search based on creationdate string"], ["modificationdate|m=s" => "search based on modificationdate string"] ] } ], [ "descriptive|d=s", "search descriptive metadata (dc identifier)"], [ "source|s=s", "search source metadata"], ["ie|i=s" => "search a specific IE"], ["maxrecords=i", "set maxrecords, default is 10"], ["startrecord=i", "set startrecord, default is 1"], ["format" => hidden => {one_of => [ ["with-format=s" => "with pronom format id"], # unsupported by Rosetta <= 7.0 #["without-format=s" => "without pronom format id"], ] } ], ["validation" => hidden => {one_of => [ ["with-valid-files" => "with valid files"], ["with-invalid-files" => "with at least one invalid file"], ] } ], ["viruscheck" => hidden => {one_of => [ ["with-passed-viruschecks" => "with passed virus checks"], ["with-missed-viruschecks" => "with missed virus checks"], ["with-failed-viruschecks" => "with failed virus checks"], ]}], ); } sub validate_args { my ($self, $opt, $args) = @_; # no args allowed but options! $self->usage_error("No args allowed") if @$args; } sub execute { my ($self, $opt, $args) = @_; my $maxrecords="10"; if (exists $opt->{maxrecords}) { $maxrecords = $opt->{maxrecords}; } my $startrecord=1; if (exists $opt->{startrecord}) { $startrecord = $opt->{startrecord}; } my @queries; if (exists $opt->{source}) { push @queries, "IE.sourceMD.content=$opt->{source}"; } if (exists $opt->{ie}) { push @queries, "IE.dc.identifier==$opt->{ie}"; } if (exists $opt->{descriptive}) { push @queries, "IE.dc.identifier==$opt->{descriptive}"; } if (exists $opt->{creationdate}) { push @queries, "IE.objectCharacteristics.creationDate==$opt->{creationdate}"; } if (exists $opt->{modificationdate}) { push @queries, "FILE.objectCharacteristics.modificationDate==$opt->{modificationdate}"; } if (exists $opt->{'with_format'}) { push @queries, "FILE.generalFileCharacteristics.formatLibraryId=$opt->{'with_format'}"; } # unsupported by Rosetta <= 7.0 #if (exists $opt->{'without_format'}) { # push @queries, "FILE.generalFileCharacteristics.formatLibraryId!=$opt->{'without_format'}"; #} if (exists $opt->{'with_valid_files'}) { push @queries, "FILE.fileValidation.isValid=true"; } if (exists $opt->{'with_invalid_files'}) { push @queries, "FILE.fileValidation.isValid=false"; } if (exists $opt->{'with_passed_viruschecks'}) { push @queries, "FILE.fileVirusCheck.status=true"; } if (exists $opt->{'with_failed_viruschecks'}) { push @queries, "FILE.fileVirusCheck.status=false"; } if (exists $opt->{'with_missed_viruschecks'}) { push @queries, "FILE.fileVirusCheck.status==%22%22"; } my $query = join(" and ", @queries); if (exists $opt->{debug}) { use Data::Printer; p( $opt); p(@queries); p( $query); } my $response = SLUB::LZA::Rosetta::TA::sru_search('ie', $query, $startrecord, $maxrecords, $opt->{verbose}); say $response; } 1;