use EPrints; use strict; my $session = EPrints::Session->new(); # security? my $content = "text/xml"; $session->send_http_header( content_type=>$content ); my $family = $session->param( "_name_family" ); my $given = $session->param( "_name_given" ); my $id = $session->param( "_id" ); my $orcid = $session->param( "_orcid" ); my $database = $session->get_database; my $dataset = $session->dataset( "eprint" ); my $name_field = $dataset->get_field( "creators_name" ); my $id_field = $dataset->get_field( "creators_id" ); my $orcid_field = $dataset->get_field( "creators_orcid" ); my @fields = ($name_field->get_sql_names, $id_field->get_sql_names, $orcid_field->get_sql_names); my $Q_table = $database->quote_identifier($dataset->get_sql_table_name); my $Q_name_table = $database->quote_identifier($dataset->get_sql_sub_table_name($name_field)); my $Q_id_table = $database->quote_identifier($dataset->get_sql_sub_table_name($id_field)); my $Q_orcid_table = $database->quote_identifier($dataset->get_sql_sub_table_name($orcid_field)); my $Q_eprintid = $database->quote_identifier( "eprintid" ); my $Q_pos = $database->quote_identifier( "pos" ); my $Q_num_matches = $database->quote_identifier( "num_matches" ); my $Q_eprint_status = $database->quote_identifier( "eprint_status" ); my $sql = "SELECT COUNT($Q_table.$Q_eprintid) ".$database->sql_AS." $Q_num_matches," . join(",", map { $database->quote_identifier($_) } @fields) . " FROM $Q_table" . " LEFT JOIN $Q_name_table" . " ON $Q_table.$Q_eprintid=$Q_name_table.$Q_eprintid" . " LEFT JOIN $Q_id_table" . " ON $Q_name_table.$Q_eprintid=$Q_id_table.$Q_eprintid " . " AND $Q_name_table.$Q_pos=$Q_id_table.$Q_pos " . " LEFT JOIN $Q_orcid_table" . " ON $Q_name_table.$Q_eprintid=$Q_orcid_table.$Q_eprintid " . " AND $Q_name_table.$Q_pos=$Q_orcid_table.$Q_pos " . " WHERE " . " $Q_table.$Q_eprint_status=".$database->quote_value( "archive" ); if( EPrints::Utils::is_set( $family ) ) { $sql .= " AND ".$database->quote_identifier("creators_name_family").$database->sql_LIKE().$database->quote_value(EPrints::Database::prep_like_value($family).'%'); } if( EPrints::Utils::is_set( $given ) ) { $sql .= " AND ".$database->quote_identifier("creators_name_given").$database->sql_LIKE().$database->quote_value(EPrints::Database::prep_like_value($given).'%'); } if( EPrints::Utils::is_set( $id ) ) { $sql .= " AND ".$database->quote_identifier("creators_id").$database->sql_LIKE().$database->quote_value(EPrints::Database::prep_like_value($id).'%'); } if( EPrints::Utils::is_set( $orcid ) ) { $sql .= " AND ".$database->quote_identifier("creators_orcid").$database->sql_LIKE().$database->quote_value(EPrints::Database::prep_like_value($orcid).'%'); } $sql .= "GROUP BY ".join(",",map { $database->quote_identifier($_) } @fields) . " ORDER BY $Q_num_matches DESC," . $database->quote_identifier("creators_name_family").",". $database->quote_identifier("creators_name_given"); my @rows; my $sth = $session->get_database->prepare_select( $sql, 'limit' => 40 ); $session->get_database->execute( $sth , $sql ); while( my @row = $sth->fetchrow_array ) { my $cnt = shift @row; my $name = $name_field->value_from_sql_row( $session, \@row ); my $id = $id_field->value_from_sql_row( $session, \@row ); my $orcid = $orcid_field->value_from_sql_row( $session, \@row ); my $item = {}; push @rows, $item; my $frag = $session->make_doc_fragment; $frag->appendChild( $name_field->render_single_value( $session, $name ) ); if( EPrints::Utils::is_set( $id ) ) { $frag->appendChild( $session->make_text( " " ) ); $frag->appendChild( $id_field->render_single_value( $session, $id ) ); if( EPrints::Utils::is_set( $orcid ) ) { $frag->appendChild( $session->make_text( " (" ) ); $frag->appendChild( $orcid_field->render_single_value( $session, $orcid ) ); $frag->appendChild( $session->make_text( ")" ) ); } } $frag->appendChild( $session->html_phrase( 'cgi/lookup/name:authored', count => $session->make_text( $cnt ) ) ); $item->{xhtml} = $frag; $item->{values} = [ "for:value:relative:_name_family" => $name->{family}, "for:value:relative:_name_given" => $name->{given}, "for:value:relative:_name_honourific" => $name->{honourific}, "for:value:relative:_name_lineage" => $name->{lineage}, "for:value:relative:_id" => $id, "for:value:relative:_orcid" => $orcid, ]; } $sth->finish(); my $ul = EPrints::Extras::render_lookup_list( $session, \@rows ); $session->send_http_header( content_type => "text/xml; charset=UTF-8" ); binmode(STDOUT,":utf8"); print < END print EPrints::XML::to_string( $ul, "utf-8", 1 ); EPrints::XML::dispose( $ul ); $session->terminate;