예제 #1
0
 def test_search_ts(self, client: HiroClient):
     from arago.hiro.backend.six.search import Hiro6SearchModel
     search = Hiro6SearchModel(client)
     with search.index(rf'+ogit\/_type:"{OgitEntity.OGIT_TIME_SERIES.id}"'
                       r' -\/DataName:"Time 99 percentile"') as res:
         yield from res
     pass
예제 #2
0
 def test_graph_model_2(self, client: HiroClient):
     from arago.hiro.backend.six.search import Hiro6SearchModel
     search = Hiro6SearchModel(client)
     res = search.graph(VertexId('ogit/Node'), 'outE()', result_type=Edge)
     assert isinstance(res, Generator)
     i = next(res)
     assert isinstance(i, Edge)
     pass
예제 #3
0
 def test_index_model(self, client: HiroClient):
     from arago.hiro.backend.six.search import Hiro6SearchModel
     search = Hiro6SearchModel(client)
     res = search.index(r'+ogit\/_id="ogit/Node"')
     assert isinstance(res, Generator)
     i = next(res)
     assert isinstance(i, Vertex)
     pass
예제 #4
0
 def test_search_blob(self, client: HiroClient):
     from arago.hiro.backend.six.search import Hiro6SearchModel
     search = Hiro6SearchModel(client)
     res = search.index(rf'+ogit\/_type:"{OgitEntity.OGIT_ATTACHMENT.id}"'
                        r' -ogit\/_creator:"*****@*****.**"'
                        r' -ogit\/_creator:"*****@*****.**"'
                        r' -ogit\/_creator:"*****@*****.**"')
     import pprint
     for vertex in res:
         pprint.pprint(vertex.to_dict())
     pass
예제 #5
0
 def __init__(self, client: 'HiroRestBaseClient') -> None:
     super().__init__(client)
     version = client.root.model.version
     if version == Version.HIRO_5:
         raise NotImplementedError()
     elif version == Version.HIRO_6:
         from arago.hiro.backend.six.search import Hiro6SearchModel as ImplSearchModel
     elif version == Version.HIRO_7:
         raise NotImplementedError()
         # from arago.hiro.backend.seven.search import Hiro7SearchModel as ImplSearchModel
     else:
         raise RuntimeError('Unreachable')
     self.__client = ImplSearchModel(client)
예제 #6
0
class SearchModel(AbcSearchModel):
    __client: Final['AbcSearchModel']

    def __init__(self, client: 'HiroRestBaseClient') -> None:
        super().__init__(client)
        version = client.root.model.version
        if version == Version.HIRO_5:
            raise NotImplementedError()
        elif version == Version.HIRO_6:
            from arago.hiro.backend.six.search import Hiro6SearchModel as ImplSearchModel
        elif version == Version.HIRO_7:
            raise NotImplementedError()
            # from arago.hiro.backend.seven.search import Hiro7SearchModel as ImplSearchModel
        else:
            raise RuntimeError('Unreachable')
        self.__client = ImplSearchModel(client)

    def connected(
            self,
            vertex_id: VERTEX_ID_T,
            edge_type: EDGE_TYPE_T,
            direction: Optional[Literal['in', 'out', 'both']] = None,
            fields: Optional[Iterable[ATTRIBUTE_T]] = None,
            vertex_types: Optional[Iterable[VERTEX_TYPE_T]] = None,
            offset: Optional[int] = None,
            limit: Optional[int] = None) -> Generator[VERTEX_T_co, None, None]:
        return self.__client.connected(vertex_id, edge_type, direction, fields,
                                       vertex_types, offset, limit)

    def external_id(
            self,
            external_id: VERTEX_XID_T,
            fields: Optional[Iterable[ATTRIBUTE_T]] = None,
            order: Optional[Order] = None
    ) -> Generator[VERTEX_T_co, None, None]:
        return self.__client.external_id(external_id, fields, order)

    def get_by_ids(
            self,
            *vertex_ids: VERTEX_ID_T,
            fields: Optional[Iterable[ATTRIBUTE_T]] = None,
            order: Optional[Order] = None
    ) -> Generator[VERTEX_T_co, None, None]:
        return self.__client.get_by_ids(*vertex_ids,
                                        fields=fields,
                                        order=order)

    def index(
            self,
            query: str,
            fields: Optional[Iterable[ATTRIBUTE_T]] = None,
            order: Optional[Order] = None,
            offset: Optional[int] = None,
            limit: Optional[int] = None) -> Generator[VERTEX_T_co, None, None]:
        # https://www.elastic.co/guide/en/elasticsearch/reference/1.7/query-dsl-query-string-query.html#query-string-syntax

        # search         search for vertices

        # usage: hiro [<general options>] vertex search  [<specific options>]
        #             [<attr:value> [<attr:value> ...]]
        # Options
        #  -c,--count                 retrieve only count of matching nodes
        #     --fields <arg>          comma separated list of field names to show in
        #                             result
        #  -l,--list                  retrieve only ids (or some specific fields) of
        #                             matching nodes
        #     --limit <arg>           limit size of result set
        #     --offset <arg>          skip first <offset> results
        #  -Q,--query <arg>           enter (ready to use) vertex query. To be used
        #                             if query is more complex than ANDed
        #                             <attr:value> pairs
        #     --show-list-meta        If a vertex attribute is a list value show it
        #                             as list even if only one element is contained
        #                             (default: show one-element list as scalar)

        return self.__client.index(query, fields, order, offset, limit)

    def graph(self,
              root: Union[VERTEX_ID_T, VERTEX_XID_T_co],
              query: str,
              fields: Optional[Iterable[ATTRIBUTE_T]] = None,
              order: Optional[Order] = None,
              offset: Optional[int] = None,
              limit: Optional[int] = None,
              result_type: Type[T] = Vertex) -> Generator[T, None, None]:
        #             count: Optional[bool] = None,
        #             list_meta: Optional[bool] = None,
        #             include_deleted: Optional[bool] = None

        # https://github.com/spmallette/GremlinDocs

        # graph          more graph operations
        # query          run gremlin query

        # usage: hiro [<general options>] graph query  [<specific options>]
        # Options
        #  -Q,--query <arg>           gremlin query
        #  -R,--root <arg>            start node (root) for gremlin
        #     --show-list-meta        If a vertex attribute is a list value show it
        #                             as list even if only one element is contained
        #                             (default: show one-element list as scalar)

        return self.__client.graph(root, query, fields, order, offset, limit,
                                   result_type)