3
3
import networkx as nx
4
4
5
5
from src .interfaces .data_api_adapter import APIAdapter
6
- from src .interfaces .result_types import FacetQueryResult , CountQueryResult , ListQueryResult , DetailsQueryResult
6
+ from src .interfaces .result_types import FacetQueryResult , CountQueryResult , ListQueryResult , DetailsQueryResult , \
7
+ ResolveResult , LinkedListQueryResult , LinkDetails
7
8
from src .shared .arango_adapter import ArangoAdapter
8
9
from src .shared .db_credentials import DBCredentials
9
10
@@ -85,6 +86,12 @@ def _get_document_cleanup_clause(self, variable: str = 'doc'):
85
86
UNSET({ variable } , ["_key", "_id", "_rev", "_from", "_to"])
86
87
"""
87
88
89
+ def _get_sortby_clause (self , sortby : dict ):
90
+ if not sortby :
91
+ return ""
92
+ clauses = [f"doc.{ k } { v } " for k , v in sortby .items ()]
93
+ return "SORT " + ', ' .join (clauses )
94
+
88
95
def get_facet_values (self , data_model : str , field : str , filter : dict = None , top : int = 20 ) -> FacetQueryResult :
89
96
label = self .labeler .get_labels_for_class_name (data_model )[0 ]
90
97
other_filter = {k : v for k , v in filter .items () if k != field } if filter else None
@@ -113,7 +120,7 @@ def get_count(self, data_model: str, filter: dict = None) -> CountQueryResult:
113
120
result = self .runQuery (query )
114
121
return CountQueryResult (query = query , count = result [0 ]) if result else CountQueryResult (query = query , count = 0 )
115
122
116
- def get_list (self , data_model : str , filter : dict = None , top : int = 20 , skip : int = 0 ) -> ListQueryResult :
123
+ def get_list (self , data_model : str , filter : dict = None , top : int = 10 , skip : int = 0 ) -> ListQueryResult :
117
124
label = self .labeler .get_labels_for_class_name (data_model )[0 ]
118
125
query = f"""
119
126
FOR doc IN `{ label } `
@@ -126,15 +133,76 @@ def get_list(self, data_model: str, filter: dict = None, top: int = 20, skip: in
126
133
list = [self .convert_to_class (data_model , res ) for res in result ]
127
134
return ListQueryResult (query = query , list = list ) if result else ListQueryResult (query = query , list = [])
128
135
136
+ def get_linked_list (self , source_data_model : str , source_id : str ,
137
+ dest_data_model : str , dest_id : str ,
138
+ edge_model : str , filter : dict = None , top : int = 10 , skip : int = 0 ) -> LinkedListQueryResult :
139
+ source_label = self .labeler .get_labels_for_class_name (source_data_model )[0 ]
140
+ dest_label = self .labeler .get_labels_for_class_name (dest_data_model )[0 ]
141
+ edge_label = self .labeler .get_labels_for_class_name (edge_model )[0 ]
142
+ if source_id is not None :
143
+ id = self .safe_key (source_id )
144
+ anchor_label = source_label
145
+ query_label = dest_label
146
+ query_model = dest_data_model
147
+ direction = 'OUTBOUND'
148
+ else :
149
+ id = self .safe_key (dest_id )
150
+ anchor_label = dest_label
151
+ query_label = source_label
152
+ query_model = source_data_model
153
+ direction = 'INBOUND'
154
+
155
+ query = f"""
156
+ FOR v, e IN 1..1 { direction } '{ anchor_label } /{ id } ' GRAPH 'graph'
157
+ OPTIONS {{ edgeCollections: ['{ edge_label } '], vertexCollections: ['{ query_label } '] }}
158
+ LIMIT { skip } , { top }
159
+ RETURN {{
160
+ edge: { self ._get_document_cleanup_clause ('e' )} ,
161
+ node: { self ._get_document_cleanup_clause ('v' )}
162
+ }}
163
+ """
164
+ results = self .runQuery (query )
165
+ result_list = []
166
+ for row in results :
167
+ result_list .append (LinkDetails (
168
+ node = self .convert_to_class (query_model , row ['node' ]),
169
+ edge = self .convert_to_class (edge_model , row ['edge' ])
170
+ ))
171
+ return LinkedListQueryResult (query = query , list = result_list )
172
+
173
+ def resolve_id (self , data_model : str , id : str , sortby : dict = {}) -> ResolveResult :
174
+ label = self .labeler .get_labels_for_class_name (data_model )[0 ]
175
+
176
+ query = f"""
177
+ FOR doc IN `{ label } `
178
+ FILTER '{ id } ' IN doc.xref
179
+ { self ._get_sortby_clause (sortby )}
180
+ LIMIT 11
181
+ RETURN { self ._get_document_cleanup_clause ()}
182
+ """
183
+
184
+ result = self .runQuery (query )
185
+ result_list = [self .convert_to_class (data_model , res ) for res in result ]
186
+
187
+ return ResolveResult (
188
+ query = query ,
189
+ match = result_list [0 ] if result_list else None ,
190
+ other_matches = result_list [1 :] if len (result_list ) > 1 else None
191
+ )
192
+
129
193
def get_details (self , data_model : str , id : str ) -> DetailsQueryResult :
130
194
label = self .labeler .get_labels_for_class_name (data_model )[0 ]
131
195
query = f"""
132
196
FOR doc IN `{ label } `
133
197
FILTER doc.id == '{ id } '
198
+ LIMIT 1
134
199
RETURN { self ._get_document_cleanup_clause ()}
135
200
"""
136
201
result = self .runQuery (query )
137
- return DetailsQueryResult (query = query , details = list (result )[0 ]) if result else DetailsQueryResult (query = query , details = {})
202
+ result_list = [self .convert_to_class (data_model , res ) for res in result ]
203
+ return DetailsQueryResult (query = query , details = result_list [0 ]) \
204
+ if result \
205
+ else DetailsQueryResult (query = query , details = None )
138
206
139
207
def get_edge_types (self , data_model : str ):
140
208
label = self .labeler .get_labels_for_class_name (data_model )[0 ]
0 commit comments