def test_lib_link(self): """test lib_link""" req = Request('get', 'http://test.test?') req.prepare() req.mimetype = None req.args = MultiDict([('data_and', 'YES'), ('lib_link', 'YES')]) req.args.update(self.append_defaults()) view = ClassicSearchRedirectView() search = view.translate(req) self.assertEqual('q=' + urllib.quote('property:("LIBRARYCATALOG")') + '&sort=' + urllib.quote('date desc, bibcode desc'), search)
def test_preprint_link(self): """preprint_link to property:eprint""" req = Request('get', 'http://test.test?') req.prepare() req.mimetype = None req.args = MultiDict([('preprint_link', 'YES'), ('data_and', 'YES')]) req.args.update(self.append_defaults()) view = ClassicSearchRedirectView() search = view.translate(req) self.assertEqual('q=' + urllib.quote('esources:("EPRINT_HTML")') + '&sort=' + urllib.quote('date desc, bibcode desc'), search)
def test_abstract(self): """test abstract""" req = Request('get', 'http://test.test?') req.prepare() req.mimetype = None req.args = MultiDict([('data_and', 'YES'), ('abstract', 'YES')]) req.args.update(self.append_defaults()) view = ClassicSearchRedirectView() search = view.translate(req) self.assertEqual('q=' + urllib.quote('abstract:*') + '&sort=' + urllib.quote('date desc, bibcode desc'), search)
def test_object(self): """object: single, multple, etc""" req = Request('get', 'http://test.test?') req.prepare() req.args = MultiDict() req.mimetype = None req.args = MultiDict([('object', urllib.quote('M31'))]) req.args.update(self.append_defaults()) view = ClassicSearchRedirectView() object_search = view.translate(req) self.assertEqual('q=' + urllib.quote('object:') + '(' + urllib.quote('"M31"') + ')' + '&sort=' + urllib.quote('date desc, bibcode desc') + '/', object_search) # single object req.args = MultiDict([('object', urllib.quote('M31\r\nM32'))]) req.args.update(self.append_defaults()) view = ClassicSearchRedirectView() object_search = view.translate(req) self.assertEqual('q=' + urllib.quote('object:') + '(' + urllib.quote('"M31" AND "M32"') + ')' + '&sort=' + urllib.quote('date desc, bibcode desc') + '/', object_search) # objects, newline separator req.args = MultiDict([('object', urllib.quote('M31;M32;M33'))]) req.args.update(self.append_defaults()) view = ClassicSearchRedirectView() object_search = view.translate(req) self.assertEqual('q=' + urllib.quote('object:') + '(' + urllib.quote('"M31" AND "M32" AND "M33"') + ')' + '&sort=' + urllib.quote('date desc, bibcode desc') + '/', object_search) # object, semicolor separator
def test_database(self): """database can be astronomy or physics not clear how to test with more than one database set""" req = Request('get', 'http://test.test?') req.prepare() req.mimetype = None req.args = MultiDict([('db_key', 'AST')]) req.args.update(self.append_defaults()) view = ClassicSearchRedirectView() search = view.translate(req) # the search query should be 'q=*:*&fq={!type=aqp v=$fq_database}&fq_database=(database:"astronomy")' # but with only some of the special characters html encoded self.assertEqual('q=*:*&fq=%7B!type%3Daqp%20v%3D%24fq_database%7D&fq_database=(database%3A%22astronomy%22)' + '&sort=' + urllib.quote('date desc, bibcode desc'), search) # astronomy only req.args = MultiDict([('db_key', 'PHY')]) req.args.update(self.append_defaults()) view = ClassicSearchRedirectView() search = view.translate(req) self.assertEqual('q=*:*&fq=%7B!type%3Daqp%20v%3D%24fq_database%7D&fq_database=(database%3A%22physics%22)' + '&sort=' + urllib.quote('date desc, bibcode desc'), search) # physics only req.args = MultiDict([('db_key', 'GEN')]) req.args.update(self.append_defaults()) view = ClassicSearchRedirectView() search = view.translate(req) self.assertEqual('q=*:*&sort=' + urllib.quote('date desc, bibcode desc') + '&error_message=' + urllib.quote('Invalid database from classic GEN'), search) # general only
def test_ref_stems(self): """test ref_stems""" req = Request('get', 'http://test.test?') req.prepare() req.mimetype = None req.args = MultiDict([('ref_stems', 'ApJ, AJ, AAS')]) req.args.update(self.append_defaults()) view = ClassicSearchRedirectView() search = view.translate(req) self.assertEqual('q=bibstem:(' + urllib.quote('"ApJ"') + ' OR ' + urllib.quote('" AJ"') + ' OR ' + urllib.quote('" AAS"') + ')' + '&sort=' + urllib.quote('date desc, bibcode desc'), search)
def test_multiple_link_properties(self): """multiple Bumblebee property fields set""" req = Request('get', 'http://test.test?') req.prepare() req.mimetype = None req.args = MultiDict([('open_link', 'YES'), ('data_link', 'YES'), ('data_and', 'YES')]) req.args.update(self.append_defaults()) view = ClassicSearchRedirectView() search = view.translate(req) self.assertEqual('q=(' + urllib.quote('esources:*') + ' AND ' + urllib.quote('property:("OPENACCESS")') + ')' + '&sort=' + urllib.quote('date desc, bibcode desc'), search)
def test_error_link(self): """test error in data group""" req = Request('get', 'http://test.test?') req.prepare() req.mimetype = None req.args = MultiDict([('data_and', 'YES'), ('abstract', 'foo')]) req.args.update(self.append_defaults()) view = ClassicSearchRedirectView() search = view.translate(req) self.assertEqual('q=*:*' + '&sort=' + urllib.quote('date desc, bibcode desc') + '&error_message=' + urllib.quote('Invalid value for abstract: foo'), search)
def test_text(self): """text search""" req = Request('get', 'http://test.test?') req.prepare() req.mimetype = None req.args = MultiDict([('text', urllib.quote('M31'))]) req.args.update(self.append_defaults()) view = ClassicSearchRedirectView() object_search = view.translate(req) self.assertEqual('q=' + urllib.quote('abs:') + '(' + urllib.quote('"M31"') + ')' + '&sort=' + urllib.quote('date desc, bibcode desc'), object_search) # single object
def test_qsearch(self): """qsearch searches metadata not used by long classic form """ req = Request('get', 'http://test.test?') req.prepare() req.args = MultiDict([('qsearch', 'foo')]) req.args.update(self.append_defaults()) req.mimetype = None view = ClassicSearchRedirectView() search = view.translate(req) self.assertEqual('q=foo&sort=' + urllib.quote('date desc, bibcode desc'), search)
def test_article_sel(self): """article_sel to property:article""" req = Request('get', 'http://test.test?') req.prepare() req.mimetype = None req.args = MultiDict([('article_sel', 'YES')]) req.args.update(self.append_defaults()) view = ClassicSearchRedirectView() search = view.translate(req) self.assertEqual( 'filter_doctype_facet_hier_fq_doctype=AND' + '&filter_doctype_facet_hier_fq_doctype=' + urllib.quote_plus('doctype_facet_hier:"0/Article"') + '&q=*:*&fq=' + urllib.quote('{') + '!' + urllib.quote('type=aqp v=$fq_doctype}') + '&fq_doctype=(' + urllib.quote_plus('doctype_facet_hier:"0/Article"') + ')' + '&sort=' + urllib.quote('date desc, bibcode desc') + '/', search) req.args = MultiDict([('article_sel', 'NO')]) req.args.update(self.append_defaults()) view = ClassicSearchRedirectView() search = view.translate(req) self.assertEqual( 'q=*:*' + '&sort=' + urllib.quote('date desc, bibcode desc') + '&error_message=' + urllib.quote('Invalid value for article_sel: NO') + '/', search)
def test_classic_results_subset(self): """test results subset""" req = Request('get', 'http://test.test?') req.prepare() req.mimetype = None req.args = MultiDict() req.args.update(self.append_defaults()) view = ClassicSearchRedirectView() search = view.translate(req) self.assertEqual('q=*:*' + '&sort=' + urllib.quote('date desc, bibcode desc') + '/', search) # no results subset req.args = MultiDict([('nr_to_return', 20), ('start_nr', 1)]) view = ClassicSearchRedirectView() req.args.update(self.append_defaults()) search = view.translate(req) # disabled this for now since it is not implemented, not that it is an error # self.assertTrue('error_message' in search) # both number to return and start index req.args = MultiDict([('nr_to_return', 20)]) view = ClassicSearchRedirectView() req.args.update(self.append_defaults()) search = view.translate(req) # self.assertTrue('error_message' in search) # only number to return req.args = MultiDict([('start_nr', 1)]) view = ClassicSearchRedirectView() req.args.update(self.append_defaults()) search = view.translate(req)
def test_classic_parameters_entry_date(self): """test entry date""" req = Request('get', 'http://test.test?') req.prepare() req.mimetype = None req.args = MultiDict() req.args.update(self.append_defaults()) view = ClassicSearchRedirectView() search = view.translate(req) self.assertEqual('q=*:*' + '&sort=' + urllib.quote('date desc, bibcode desc') + '/', search) # no pub date req.args = MultiDict([('start_entry_year', "1990"), ('end_entry_year', "1991")]) req.args.update(self.append_defaults()) view = ClassicSearchRedirectView() search = view.translate(req) self.assertEqual( 'q=' + urllib.quote('entdate:["1990-01-01" TO "1991-12-31"]') + '&sort=' + urllib.quote('date desc, bibcode desc') + '/', search) # both years only req.args = MultiDict([('start_entry_year', "1990"), ('start_entry_mon', "5"), ('end_entry_year', "1991"), ('end_entry_mon', "9")]) req.args.update(self.append_defaults()) view = ClassicSearchRedirectView() search = view.translate(req) self.assertEqual( 'q=' + urllib.quote('entdate:["1990-05-01" TO "1991-09-30"]') + '&sort=' + urllib.quote('date desc, bibcode desc') + '/', search) # years and months req.args = MultiDict([('start_entry_year', "1990"), ('end_entry_year', "1991"), ('end_entry_mon', "10")]) req.args.update(self.append_defaults()) view = ClassicSearchRedirectView() search = view.translate(req) self.assertEqual( 'q=' + urllib.quote('entdate:["1990-01-01" TO "1991-10-31"]') + '&sort=' + urllib.quote('date desc, bibcode desc') + '/', search) # no start mon req.args = MultiDict([('start_entry_year', "1990"), ('start_entry_mon', "5"), ('end_entry_year', "1991")]) req.args.update(self.append_defaults()) view = ClassicSearchRedirectView() search = view.translate(req) self.assertEqual( 'q=' + urllib.quote('entdate:["1990-05-01" TO "1991-12-31"]') + '&sort=' + urllib.quote('date desc, bibcode desc') + '/', search) # no end mon req.args = MultiDict([('start_entry_year', "1990"), ('start_entry_mon', "5")]) req.args.update(self.append_defaults()) view = ClassicSearchRedirectView() search = view.translate(req) self.assertEqual( 'q=' + urllib.quote('entdate:["1990-05-01" TO "{}"]'.format( datetime.now().strftime("%Y-%m-%d"))) + '&sort=' + urllib.quote('date desc, bibcode desc') + '/', search) # no end req.args = MultiDict([('end_entry_year', "1991"), ('end_entry_mon', "10")]) req.args.update(self.append_defaults()) view = ClassicSearchRedirectView() search = view.translate(req) self.assertEqual( 'q=' + urllib.quote('entdate:["0001-01-01" TO "1991-10-31"]') + '&sort=' + urllib.quote('date desc, bibcode desc') + '/', search) # no start req.args = MultiDict([('start_entry_year', "1990"), ('start_entry_mon', "5"), ('start_entry_day', "6"), ('end_entry_year', "1991"), ('end_entry_mon', "9"), ('end_entry_day', "10")]) req.args.update(self.append_defaults()) view = ClassicSearchRedirectView() search = view.translate(req) self.assertEqual( 'q=' + urllib.quote('entdate:["1990-05-06" TO "1991-09-10"]') + '&sort=' + urllib.quote('date desc, bibcode desc') + '/', search) # years, months, days req.args = MultiDict([('start_entry_year', "90"), ('end_entry_year', "10")]) req.args.update(self.append_defaults()) view = ClassicSearchRedirectView() search = view.translate(req) self.assertEqual( 'q=' + urllib.quote('entdate:["1990-01-01" TO "2010-12-31"]') + '&sort=' + urllib.quote('date desc, bibcode desc') + '/', search) # years, months, days req.args = MultiDict([('start_entry_year', "20"), ('end_entry_year', "19")]) req.args.update(self.append_defaults()) view = ClassicSearchRedirectView() search = view.translate(req) self.assertEqual( 'q=' + urllib.quote('entdate:["1920-01-01" TO "2019-12-31"]') + '&sort=' + urllib.quote('date desc, bibcode desc') + '/', search) # years, months, days
def test_authors(self): """authors: single, multple, quoted, and/or""" req = Request('get', 'http://test.test?') req.prepare() req.mimetype = None req.args = MultiDict() req.args.update(self.append_defaults()) view = ClassicSearchRedirectView() empty_search = view.translate(req) self.assertEqual('q=*:*' + '&sort=' + urllib.quote('date desc, bibcode desc') + '/', empty_search, 'author test') # no authors req.args = MultiDict([('author', urllib.quote('+Huchra, John'))]) req.args.update(self.append_defaults()) view = ClassicSearchRedirectView() author_search = view.translate(req) # parentheses are not urlencoded self.assertEqual('q=' + urllib.quote('author:') + '(' + urllib.quote('"Huchra, John"') + ')' + '&sort=' + urllib.quote('date desc, bibcode desc') + '/', author_search) # single author no quotes req.args = MultiDict([('author', urllib.quote('"Huchra,+John"'))]) req.args.update(self.append_defaults()) view = ClassicSearchRedirectView() author_search = view.translate(req) self.assertEqual('q=' + urllib.quote('author:') + '(' + urllib.quote('"Huchra,John"') + ')' + '&sort=' + urllib.quote('date desc, bibcode desc') + '/', author_search) # single author with quotes req.args = MultiDict([ ('author', urllib.quote('Huchra, John\r\nMacri, Lucas M.')) ]) req.args.update(self.append_defaults()) view = ClassicSearchRedirectView() author_search = view.translate(req) self.assertEqual('q=' + urllib.quote('author:') + '(' + urllib.quote('"Huchra, John" AND "Macri, Lucas M."') + ')' + '&sort=' + urllib.quote('date desc, bibcode desc') + '/', author_search) # authors, newline separator req.args = MultiDict([ ('author', urllib.quote('+Huchra, John;-Macri, Lucas M.')) ]) req.args.update(self.append_defaults()) view = ClassicSearchRedirectView() author_search = view.translate(req) self.assertEqual( 'q=' + urllib.quote('author:') + '(' + urllib.quote('"Huchra, John" AND -"Macri, Lucas M."') + ')' + '&sort=' + urllib.quote('date desc, bibcode desc') + '/', author_search) # authors, semicolon separator req.args = MultiDict([('author', urllib.quote('Huchra, John')), ('aut_xct', 'YES')]) req.args.update(self.append_defaults()) view = ClassicSearchRedirectView() author_search = view.translate(req) self.assertEqual('q=' + urllib.quote('=author:') + '(' + urllib.quote('"Huchra, John"') + ')' + '&sort=' + urllib.quote('date desc, bibcode desc') + '/', author_search) # author with exact match # changing OR to AND and issuing a warning req.args = MultiDict([('author', urllib.quote('Huchra, John;Macri, Lucas M.')), ('aut_logic', 'OR')]) req.args.update(self.append_defaults()) view = ClassicSearchRedirectView() author_search = view.translate(req) self.assertEqual( 'q=' + urllib.quote('author:') + '(' + urllib.quote('"Huchra, John" AND "Macri, Lucas M."') + ')' + '&sort=' + urllib.quote('date desc, bibcode desc') + '&warning_message=' + urllib.quote( 'author search terms combined with AND rather than OR') + '/', author_search) # authors with or
def test_pubdate(self): """test pubdate""" req = Request('get', 'http://test.test?') req.prepare() req.args = MultiDict() req.args.update(self.append_defaults()) req.mimetype = None view = ClassicSearchRedirectView() search = view.translate(req) self.assertEqual('q=*:*' + '&sort=' + urllib.quote('date desc, bibcode desc') + '/', search) # no pub date req.args = MultiDict([('start_year', 1990), ('end_year', 1991)]) req.args.update(self.append_defaults()) view = ClassicSearchRedirectView() search = view.translate(req) self.assertEqual('q=' + urllib.quote('pubdate:[1990-01 TO 1991-12]') + '&sort=' + urllib.quote('date desc, bibcode desc') + '/', search) # both years only req.args = MultiDict([('start_year', 1990), ('start_mon', 5), ('end_year', 1991), ('end_mon', 10)]) req.args.update(self.append_defaults()) view = ClassicSearchRedirectView() search = view.translate(req) self.assertEqual('q=' + urllib.quote('pubdate:[1990-05 TO 1991-10]') + '&sort=' + urllib.quote('date desc, bibcode desc') + '/', search) # years and months req.args = MultiDict([('start_year', 1990), ('end_year', 1991), ('end_mon', 10)]) req.args.update(self.append_defaults()) view = ClassicSearchRedirectView() search = view.translate(req) self.assertEqual('q=' + urllib.quote('pubdate:[1990-01 TO 1991-10]') + '&sort=' + urllib.quote('date desc, bibcode desc') + '/', search) # no start mon req.args = MultiDict([('start_year', 1990), ('start_mon', 5), ('end_year', 1991)]) req.args.update(self.append_defaults()) view = ClassicSearchRedirectView() search = view.translate(req) self.assertEqual('q=' + urllib.quote('pubdate:[1990-05 TO 1991-12]') + '&sort=' + urllib.quote('date desc, bibcode desc') + '/', search) # no end mon req.args = MultiDict([('start_year', 1990), ('start_mon', 5)]) req.args.update(self.append_defaults()) view = ClassicSearchRedirectView() search = view.translate(req) n = datetime.now() self.assertEqual('q=' + urllib.quote('pubdate:[1990-05 TO *]') + '&sort=' + urllib.quote('date desc, bibcode desc') + '/', search) # no end req.args = MultiDict([('end_year', 1991), ('end_mon', 10)]) req.args.update(self.append_defaults()) view = ClassicSearchRedirectView() search = view.translate(req) self.assertEqual('q=' + urllib.quote('pubdate:[* TO 1991-10]') + '&sort=' + urllib.quote('date desc, bibcode desc') + '/', search) # no start
def test_classic_parameters_entry_date(self): """test entry date""" req = Request('get', 'http://test.test?') req.prepare() req.mimetype = None req.args = MultiDict() req.args.update(self.append_defaults()) view = ClassicSearchRedirectView() search = view.translate(req) self.assertEqual('q=*:*' + '&sort=' + urllib.quote('date desc, bibcode desc'), search) # no pub date req.args = MultiDict([('start_entry_year', 1990), ('end_entry_year', 1991)]) req.args.update(self.append_defaults()) view = ClassicSearchRedirectView() search = view.translate(req) self.assertEqual('q=' + urllib.quote('entry_date:["1990-01-01T00:00:00.000Z" TO "1991-12-31T00:00:00.000Z"]') + '&sort=' + urllib.quote('date desc, bibcode desc'), search) # both years only req.args = MultiDict([('start_entry_year', 1990), ('start_entry_mon', 5), ('end_entry_year', 1991), ('end_entry_mon', 9)]) req.args.update(self.append_defaults()) view = ClassicSearchRedirectView() search = view.translate(req) self.assertEqual('q=' + urllib.quote('entry_date:["1990-05-01T00:00:00.000Z" TO "1991-09-30T00:00:00.000Z"]') + '&sort=' + urllib.quote('date desc, bibcode desc'), search) # years and months req.args = MultiDict([('start_entry_year', 1990), ('end_entry_year', 1991), ('end_entry_mon', 10)]) req.args.update(self.append_defaults()) view = ClassicSearchRedirectView() search = view.translate(req) self.assertEqual('q=' + urllib.quote('entry_date:["1990-01-01T00:00:00.000Z" TO "1991-10-31T00:00:00.000Z"]') + '&sort=' + urllib.quote('date desc, bibcode desc'), search) # no start mon req.args = MultiDict([('start_entry_year', 1990), ('start_entry_mon', 5), ('end_entry_year', 1991)]) req.args.update(self.append_defaults()) view = ClassicSearchRedirectView() search = view.translate(req) self.assertEqual('q=' + urllib.quote('entry_date:["1990-05-01T00:00:00.000Z" TO "1991-12-31T00:00:00.000Z"]') + '&sort=' + urllib.quote('date desc, bibcode desc'), search) # no end mon req.args = MultiDict([('start_entry_year', 1990), ('start_entry_mon', 5)]) req.args.update(self.append_defaults()) view = ClassicSearchRedirectView() search = view.translate(req) self.assertEqual('q=' + urllib.quote('entry_date:["1990-05-01T00:00:00.000Z" TO *]') + '&sort=' + urllib.quote('date desc, bibcode desc'), search) # no end req.args = MultiDict([('end_entry_year', 1991), ('end_entry_mon', 10)]) req.args.update(self.append_defaults()) view = ClassicSearchRedirectView() search = view.translate(req) self.assertEqual('q=' + urllib.quote('entry_date:["0000-00-00T00:00:00.000Z" TO "1991-10-31T00:00:00.000Z"]') + '&sort=' + urllib.quote('date desc, bibcode desc'), search) # no start req.args = MultiDict([('start_entry_year', 1990), ('start_entry_mon', 5), ('start_entry_day', 6), ('end_entry_year', 1991), ('end_entry_mon', 9), ('end_entry_day', 10)]) req.args.update(self.append_defaults()) view = ClassicSearchRedirectView() search = view.translate(req) self.assertEqual('q=' + urllib.quote('entry_date:["1990-05-06T00:00:00.000Z" TO "1991-09-10T00:00:00.000Z"]') + '&sort=' + urllib.quote('date desc, bibcode desc'), search) # years, months, days
def test_arxiv_sel(self): """test arxiv_sel""" req = Request('get', 'http://test.test?') req.prepare() req.mimetype = None req.args = MultiDict([('arxiv_sel', 'cs'), ('arxiv_sel', 'physics')]) req.args.update(self.append_defaults()) view = ClassicSearchRedirectView() search = view.translate(req) self.assertEqual( 'q=keyword:(' + urllib.quote('"computer science" OR "physics"') + ')' + '&sort=' + urllib.quote('date desc, bibcode desc') + '/', search) req.args = MultiDict([('arxiv_sel', '')]) req.args.update(self.append_defaults()) view = ClassicSearchRedirectView() search = view.translate(req) self.assertEqual('q=*:*' + '&sort=' + urllib.quote('date desc, bibcode desc') + \ '&error_message=' + urllib.quote('Invalid value for arxiv_sel: ') + '/', search) req.args = MultiDict([('arxiv_sel', 'ADS')]) req.args.update(self.append_defaults()) view = ClassicSearchRedirectView() search = view.translate(req) self.assertEqual('q=*:*' + '&sort=' + urllib.quote('date desc, bibcode desc') + \ '&error_message=' + urllib.quote('Invalid value for arxiv_sel: ADS') + '/', search) req.args = MultiDict([('arxiv_sel', 'astro-ph'), ('arxiv_sel', 'cond-mat'), ('arxiv_sel', 'cs'), ('arxiv_sel', 'gr-qc'), ('arxiv_sel', 'hep-ex'), ('arxiv_sel', 'hep-lat'), ('arxiv_sel', 'hep-ph'), ('arxiv_sel', 'hep-th'), ('arxiv_sel', 'math'), ('arxiv_sel', 'math-ph'), ('arxiv_sel', 'nlin'), ('arxiv_sel', 'nucl-ex'), ('arxiv_sel', 'nucl-th'), ('arxiv_sel', 'physics'), ('arxiv_sel', 'quant-ph'), ('arxiv_sel', 'q-bio')]) req.args.update(self.append_defaults()) view = ClassicSearchRedirectView() search = view.translate(req) self.assertEqual( 'q=property:(' + urllib.quote("EPRINT_OPENACCESS") + ')' + '&sort=' + urllib.quote('date desc, bibcode desc') + '/', search) req.args = MultiDict([('db_key', 'AST'), ('arxiv_sel', 'cs'), ('arxiv_sel', 'physics')]) req.args.update(self.append_defaults()) view = ClassicSearchRedirectView() search = view.translate(req) self.assertEqual( 'filter_database_fq_database=OR' + '&filter_database_fq_database=database:"astronomy"' + '&q=*:*&fq=%7B!type%3Daqp%20v%3D%24fq_database%7D&fq_database=(database%3A%22astronomy%22)' + '&sort=' + urllib.quote('date desc, bibcode desc') + '&warning_message=' + urllib.quote( 'when the astronomy or physics databases are selected, the arXiv selection is ignored' ) + '/', search) # astronomy only