Exemplo n.º 1
0
def _update_query_with_classification(q: AdvancedQuery, data: MultiDict) \
        -> AdvancedQuery:
    q.classification = ClassificationList()
    archives = [('computer_science', 'cs'), ('economics', 'econ'),
                ('eess', 'eess'), ('mathematics', 'math'),
                ('q_biology', 'q-bio'), ('q_finance', 'q-fin'),
                ('statistics', 'stat')]
    for field, archive in archives:
        if data.get(field):
            # Fix for these typing issues is coming soon!
            #  See: https://github.com/python/mypy/pull/4397
            q.classification.append(
                Classification(archive={'id': archive})  # type: ignore
            )
    if data.get('physics') and 'physics_archives' in data:
        if 'all' in data['physics_archives']:
            q.classification.append(
                Classification(group={'id': 'grp_physics'})  # type: ignore
            )
        else:
            q.classification.append(
                Classification(  # type: ignore
                    group={'id': 'grp_physics'},
                    archive={'id': data['physics_archives']}))
    return q
Exemplo n.º 2
0
def _update_query_with_classification(q: AdvancedQuery,
                                      data: MultiDict) -> AdvancedQuery:
    q.classification = ClassificationList()
    archives = [
        ("computer_science", "cs"),
        ("economics", "econ"),
        ("eess", "eess"),
        ("mathematics", "math"),
        ("q_biology", "q-bio"),
        ("q_finance", "q-fin"),
        ("statistics", "stat"),
    ]
    for field, archive in archives:
        if data.get(field):
            # Fix for these typing issues is coming soon!
            #  See: https://github.com/python/mypy/pull/4397
            q.classification.append(
                Classification(archive={"id": archive})  # type: ignore
            )
    if data.get("physics") and "physics_archives" in data:
        if "all" in data["physics_archives"]:
            q.classification.append(
                Classification(group={"id": "grp_physics"})  # type: ignore
            )
        else:
            q.classification.append(
                Classification(  # type: ignore
                    group={"id": "grp_physics"},
                    archive={"id": data["physics_archives"]},
                ))
    return q
Exemplo n.º 3
0
def _update_with_archives(q: SimpleQuery, archives: List[str]) -> SimpleQuery:
    """
    Search within a group or archive.

    Parameters
    ----------
    q : :class:`SimpleQuery`
    groups_or_archives : str

    Returns
    -------
    :class:`SimpleQuery`
    """
    logger.debug('Search within %s', archives)
    q.classification = ClassificationList([
        Classification(archive={'id': archive})  # type: ignore
        for archive in archives
    ])
    return q
Exemplo n.º 4
0
    def test_advanced_query(self, mock_Elasticsearch, mock_Search):
        """:class:`.index.search` supports :class:`AdvancedQuery`."""
        mock_results = mock.MagicMock()
        mock_results.__getitem__.return_value = {'total': 53}
        rdata = dict(authors=[{'full_name': 'N. Ame'}],
                     owners=[{'full_name': 'N. Ame'}],
                     submitter={'full_name': 'N. Ame'},
                     paper_id='1234.56789')
        mock_result = mock.MagicMock(_d_=rdata, **rdata)
        mock_result.meta.score = 1
        mock_results.__iter__.return_value = [mock_result]
        mock_Search.execute.return_value = mock_results

        # Support the chaining API for py-ES.
        mock_Search.return_value = mock_Search
        mock_Search.filter.return_value = mock_Search
        mock_Search.highlight.return_value = mock_Search
        mock_Search.highlight_options.return_value = mock_Search
        mock_Search.query.return_value = mock_Search
        mock_Search.sort.return_value = mock_Search
        mock_Search.__getitem__.return_value = mock_Search

        query = AdvancedQuery(
            order='relevance',
            size=10,
            date_range=DateRange(
                start_date=datetime.now() - timedelta(days=5),
                end_date=datetime.now()
            ),
            classification=ClassificationList([
                Classification(
                    group={'id': 'physics'},
                    archive={'id': 'physics'},
                    category={'id': 'hep-th'}
                )
            ]),
            terms=FieldedSearchList([
                FieldedSearchTerm(operator='AND', field='title', term='foo'),
                FieldedSearchTerm(operator='AND', field='author', term='joe'),
                FieldedSearchTerm(operator='OR', field='abstract', term='hmm'),
                FieldedSearchTerm(operator='NOT', field='comments', term='eh'),
                FieldedSearchTerm(operator='AND', field='journal_ref',
                                  term='jref (1999) 1:2-3'),
                FieldedSearchTerm(operator='AND', field='acm_class',
                                  term='abc123'),
                FieldedSearchTerm(operator='AND', field='msc_class',
                                  term='abc123'),
                FieldedSearchTerm(operator='OR', field='report_num',
                                  term='abc123'),
                FieldedSearchTerm(operator='OR', field='doi',
                                  term='10.01234/56789'),
                FieldedSearchTerm(operator='OR', field='orcid',
                                  term='0000-0000-0000-0000'),
                FieldedSearchTerm(operator='OR', field='author_id',
                                  term='Bloggs_J'),
            ])
        )
        document_set = index.SearchSession.search(query)
        # self.assertIsInstance(document_set, DocumentSet)
        self.assertEqual(document_set['metadata']['start'], 0)
        self.assertEqual(document_set['metadata']['total'], 53)
        self.assertEqual(document_set['metadata']['current_page'], 1)
        self.assertEqual(document_set['metadata']['total_pages'], 6)
        self.assertEqual(document_set['metadata']['size'], 10)
        self.assertEqual(len(document_set['results']), 1)
Exemplo n.º 5
0
    def test_advanced_query(self, mock_Elasticsearch, mock_Search):
        """:class:`.index.search` supports :class:`AdvancedQuery`."""
        mock_results = mock.MagicMock()
        mock_results.__getitem__.return_value = {"total": 53}
        rdata = mock_rdata()
        mock_result = mock.MagicMock(_d_=rdata, **rdata)
        mock_result.meta.score = 1
        mock_results.__iter__.return_value = [mock_result]
        mock_Search.execute.return_value = mock_results

        # Support the chaining API for py-ES.
        mock_Search.return_value = mock_Search
        mock_Search.filter.return_value = mock_Search
        mock_Search.highlight.return_value = mock_Search
        mock_Search.highlight_options.return_value = mock_Search
        mock_Search.query.return_value = mock_Search
        mock_Search.sort.return_value = mock_Search
        mock_Search.__getitem__.return_value = mock_Search

        query = AdvancedQuery(
            order="relevance",
            size=10,
            date_range=DateRange(
                start_date=datetime.now() - timedelta(days=5),
                end_date=datetime.now(),
            ),
            classification=ClassificationList([
                Classification(
                    group={"id": "physics"},
                    archive={"id": "physics"},
                    category={"id": "hep-th"},
                )
            ]),
            terms=FieldedSearchList([
                FieldedSearchTerm(operator="AND", field="title", term="foo"),
                FieldedSearchTerm(operator="AND", field="author", term="joe"),
                FieldedSearchTerm(operator="OR", field="abstract", term="hmm"),
                FieldedSearchTerm(operator="NOT", field="comments", term="eh"),
                FieldedSearchTerm(
                    operator="AND",
                    field="journal_ref",
                    term="jref (1999) 1:2-3",
                ),
                FieldedSearchTerm(operator="AND",
                                  field="acm_class",
                                  term="abc123"),
                FieldedSearchTerm(operator="AND",
                                  field="msc_class",
                                  term="abc123"),
                FieldedSearchTerm(operator="OR",
                                  field="report_num",
                                  term="abc123"),
                FieldedSearchTerm(operator="OR",
                                  field="doi",
                                  term="10.01234/56789"),
                FieldedSearchTerm(
                    operator="OR",
                    field="orcid",
                    term="0000-0000-0000-0000",
                ),
                FieldedSearchTerm(operator="OR",
                                  field="author_id",
                                  term="Bloggs_J"),
            ]),
        )
        document_set = index.SearchSession.search(query)
        # self.assertIsInstance(document_set, DocumentSet)
        self.assertEqual(document_set["metadata"]["start"], 0)
        self.assertEqual(document_set["metadata"]["total_results"], 53)
        self.assertEqual(document_set["metadata"]["current_page"], 1)
        self.assertEqual(document_set["metadata"]["total_pages"], 6)
        self.assertEqual(document_set["metadata"]["size"], 10)
        self.assertEqual(len(document_set["results"]), 1)