Skip to content

Commit 84bdf20

Browse files
Merge pull request #281 from tigergraph/release_1.9.1
release 1.9.1 deprecate default graph name MyGraph and add more functions for 4.x
2 parents 4ddaff6 + 34841d5 commit 84bdf20

43 files changed

Lines changed: 3202 additions & 725 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

pyTigerGraph/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,6 @@
22
from pyTigerGraph.pytgasync.pyTigerGraph import AsyncTigerGraphConnection
33
from pyTigerGraph.common.exception import TigerGraphException
44

5-
__version__ = "1.9.0"
5+
__version__ = "1.9.1"
66

77
__license__ = "Apache 2"

pyTigerGraph/ai/ai.py

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -247,7 +247,7 @@ def initializeServer(self, server="graphrag"):
247247
url = f"{self.nlqs_host}/{self.conn.graphname}/{self.server_mode}/initialize"
248248
return self.conn._req("POST", url, authMode="pwd", resKey=None)
249249

250-
def createDocumentIngest(self, data_source, data_source_config, loader_config, file_format):
250+
def createDocumentIngest(self, data_source="", data_source_config={}, loader_config={}, file_format=""):
251251
""" Create a document ingest.
252252
Args:
253253
data_source (str):
@@ -271,7 +271,7 @@ def createDocumentIngest(self, data_source, data_source_config, loader_config, f
271271
url = f"{self.nlqs_host}/{self.conn.graphname}/{self.server_mode}/create_ingest"
272272
return self.conn._req("POST", url, authMode="pwd", data=data, jsonData=True, resKey=None)
273273

274-
def runDocumentIngest(self, load_job_id, data_source_id, data_path, data_source="remote"):
274+
def runDocumentIngest(self, load_job_id="", data_source_id="", data_path="", data_source="", load_job_info: dict = None):
275275
""" Run a document ingest.
276276
Args:
277277
load_job_id (str):
@@ -280,17 +280,38 @@ def runDocumentIngest(self, load_job_id, data_source_id, data_path, data_source=
280280
The data source ID of the document ingest.
281281
data_path (str):
282282
The data path of the document ingest.
283+
data_source (str):
284+
The data source of the document ingest.
285+
load_job_info (dict):
286+
The information of the load job.
283287
Returns:
284288
JSON response from the document ingest.
285289
"""
286-
if data_source.lower() == "local" or data_path.startswith(("/", ".", "~")) :
290+
if load_job_info:
291+
if not load_job_id and "load_job_id" in load_job_info:
292+
load_job_id = load_job_info["load_job_id"]
293+
if not data_source_id and "data_source_id" in load_job_info:
294+
data_source_id = load_job_info["data_source_id"]
295+
if not data_path and "data_path" in load_job_info:
296+
data_path = load_job_info["data_path"]
297+
if not data_source and "data_source" in load_job_info:
298+
data_source = load_job_info["data_source"]
299+
300+
if not load_job_id or not data_path or not data_source_id and not load_job_info:
301+
raise ValueError("load_job_id and data_path are required, one of data_source_id or load_job_info must be provided.")
302+
303+
if data_source.lower() == "local" and data_path.startswith(("/", ".", "~")) :
287304
return self.conn.runLoadingJobWithFile(data_path, data_source_id, load_job_id)
288305
else:
289306
data = {
290307
"load_job_id": load_job_id,
291-
"data_source_id": data_source_id,
292308
"file_path": data_path
293309
}
310+
if load_job_info:
311+
data["load_job_info"] = load_job_info
312+
if data_source_id:
313+
data["data_source_id"] = data_source_id
314+
294315
url = f"{self.nlqs_host}/{self.conn.graphname}/{self.server_mode}/ingest"
295316
return self.conn._req("POST", url, authMode="pwd", data=data, jsonData=True, resKey=None)
296317

pyTigerGraph/common/auth.py

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ def _parse_create_secret(response: str, alias: str = "", withAlias: bool = False
4040
if not withAlias:
4141
if logger.level == logging.DEBUG:
4242
logger.debug("return: " + str(secret))
43-
logger.info("exit: createSecret (withAlias")
43+
logger.debug("exit: createSecret (withAlias")
4444

4545
return secret
4646

@@ -49,7 +49,7 @@ def _parse_create_secret(response: str, alias: str = "", withAlias: bool = False
4949

5050
if logger.level == logging.DEBUG:
5151
logger.debug("return: " + str(ret))
52-
logger.info("exit: createSecret (alias)")
52+
logger.debug("exit: createSecret (alias)")
5353

5454
return ret
5555

@@ -61,7 +61,7 @@ def _parse_create_secret(response: str, alias: str = "", withAlias: bool = False
6161

6262
def _prep_token_request(restppUrl: str,
6363
gsUrl: str,
64-
graphname: str,
64+
graphname: str = None,
6565
version: str = None,
6666
secret: str = None,
6767
lifetime: int = None,
@@ -83,7 +83,7 @@ def _prep_token_request(restppUrl: str,
8383
else:
8484
method = "POST"
8585
url = gsUrl + "/gsql/v1/tokens" # used for TG 4.x
86-
data = {"graph": graphname}
86+
data = {"graph": graphname} if graphname else {}
8787

8888
# alt_url and alt_data used to construct the method and url for functions run in TG version 3.x
8989
alt_url = restppUrl+"/requesttoken" # used for TG 3.x
@@ -113,7 +113,9 @@ def _parse_token_response(response: dict,
113113
mainVer: int,
114114
base64_credential: str) -> Tuple[Union[Tuple[str, str], str], dict]:
115115
if not response.get("error"):
116-
token = response["token"]
116+
# Note that /requesttoken has sightly different response using username-password pair.
117+
# See https://docs.tigergraph.com/tigergraph-server/3.10/api/built-in-endpoints#_request_a_token
118+
token = response.get("results", response)["token"]
117119
if setToken:
118120
apiToken = token
119121
authHeader = {'Authorization': "Bearer " + apiToken}
@@ -125,7 +127,7 @@ def _parse_token_response(response: dict,
125127
if response.get("expiration"):
126128
# On >=4.1 the format for the date of expiration changed. Convert back to old format
127129
# Can't use self._versionGreaterThan4_0 since you need a token for that
128-
if mainVer == 4:
130+
if mainVer >= 4:
129131
return (token, response.get("expiration")), authHeader
130132
else:
131133
return (token, response.get("expiration"), \

pyTigerGraph/common/base.py

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ def excepthook(type, value, traceback):
3333

3434

3535
class PyTigerGraphCore(object):
36-
def __init__(self, host: str = "http://127.0.0.1", graphname: str = "MyGraph",
36+
def __init__(self, host: str = "http://127.0.0.1", graphname: str = "",
3737
gsqlSecret: str = "", username: str = "tigergraph", password: str = "tigergraph",
3838
tgCloud: bool = False, restppPort: Union[int, str] = "9000",
3939
gsPort: Union[int, str] = "14240", gsqlVersion: str = "", version: str = "",
@@ -85,7 +85,7 @@ def __init__(self, host: str = "http://127.0.0.1", graphname: str = "MyGraph",
8585
TigerGraphException: In case on invalid URL scheme.
8686
8787
"""
88-
logger.info("entry: __init__")
88+
logger.debug("entry: __init__")
8989
if logger.level == logging.DEBUG:
9090
logger.debug("params: " + self._locals(locals()))
9191

@@ -110,6 +110,7 @@ def __init__(self, host: str = "http://127.0.0.1", graphname: str = "MyGraph",
110110
self.base64_credential = base64.b64encode(
111111
"{0}:{1}".format(self.username, self.password).encode("utf-8")).decode("utf-8")
112112

113+
# Detect auth mode automatically by checking if jwtToken or apiToken is provided
113114
self.authHeader = self._set_auth_header()
114115

115116
# TODO Eliminate version and use gsqlVersion only, meaning TigerGraph server version
@@ -179,7 +180,7 @@ def __init__(self, host: str = "http://127.0.0.1", graphname: str = "MyGraph",
179180
self.restppPort = restppPort
180181
self.restppUrl = self.host + ":" + self.restppPort
181182

182-
self.gsPort = ""
183+
self.gsPort = gsPort
183184
if self.tgCloud and (gsPort == "14240" or gsPort == "443"):
184185
self.gsPort = sslPort
185186
self.gsUrl = self.host + ":" + sslPort
@@ -211,7 +212,7 @@ def __init__(self, host: str = "http://127.0.0.1", graphname: str = "MyGraph",
211212

212213
self.asynchronous = False
213214

214-
logger.info("exit: __init__")
215+
logger.debug("exit: __init__")
215216

216217
def _set_auth_header(self):
217218
"""Set the authentication header based on available tokens or credentials."""
@@ -276,7 +277,7 @@ def _error_check(self, res: dict) -> bool:
276277
return False
277278

278279
def _prep_req(self, authMode, headers, url, method, data):
279-
logger.info("entry: _req")
280+
logger.debug("entry: _prep_req")
280281
if logger.level == logging.DEBUG:
281282
logger.debug("params: " + self._locals(locals()))
282283

@@ -300,14 +301,14 @@ def _prep_req(self, authMode, headers, url, method, data):
300301
self.authHeader = {
301302
'Authorization': 'Basic {0}'.format(self.base64_credential)}
302303
_headers = self.authHeader
303-
authMode = 'pwd'
304-
305-
if authMode == "pwd":
304+
self.authMode = "pwd"
305+
else:
306306
if self.jwtToken:
307307
_headers = {'Authorization': "Bearer " + self.jwtToken}
308308
else:
309309
_headers = {'Authorization': 'Basic {0}'.format(
310310
self.base64_credential)}
311+
self.authMode = "pwd"
311312

312313
if headers:
313314
_headers.update(headers)
@@ -328,10 +329,12 @@ def _prep_req(self, authMode, headers, url, method, data):
328329
verify = True
329330

330331
_headers.update({"X-User-Agent": "pyTigerGraph"})
332+
logger.debug("exit: _prep_req")
331333

332334
return _headers, _data, verify
333335

334336
def _parse_req(self, res, jsonResponse, strictJson, skipCheck, resKey):
337+
logger.debug("entry: _parse_req")
335338
if jsonResponse:
336339
try:
337340
res = json.loads(res.text, strict=strictJson)
@@ -345,7 +348,7 @@ def _parse_req(self, res, jsonResponse, strictJson, skipCheck, resKey):
345348
if not resKey:
346349
if logger.level == logging.DEBUG:
347350
logger.debug("return: " + str(res))
348-
logger.info("exit: _req (no resKey)")
351+
logger.debug("exit: _parse_req (no resKey)")
349352

350353
return res
351354

@@ -354,7 +357,7 @@ def _parse_req(self, res, jsonResponse, strictJson, skipCheck, resKey):
354357
logger.info("Removed _ from resKey")
355358
if logger.level == logging.DEBUG:
356359
logger.debug("return: " + str(res[resKey]))
357-
logger.info("exit: _req (resKey)")
360+
logger.debug("exit: _parse_req (resKey)")
358361

359362
return res[resKey]
360363

pyTigerGraph/common/edge.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ def _parse_get_edge_source_vertex_type(edgeTypeDetails):
2525

2626
if logger.level == logging.DEBUG:
2727
logger.debug("return: " + str(ret))
28-
logger.info("exit: getEdgeSourceVertexType (single source)")
28+
logger.debug("exit: getEdgeSourceVertexType (single source)")
2929

3030
return ret
3131

@@ -38,7 +38,7 @@ def _parse_get_edge_source_vertex_type(edgeTypeDetails):
3838

3939
if logger.level == logging.DEBUG:
4040
logger.debug("return: " + str(vts))
41-
logger.info("exit: getEdgeSourceVertexType (multi source)")
41+
logger.debug("exit: getEdgeSourceVertexType (multi source)")
4242

4343
return vts
4444
else:
@@ -57,7 +57,7 @@ def _parse_get_edge_target_vertex_type(edgeTypeDetails):
5757

5858
if logger.level == logging.DEBUG:
5959
logger.debug("return: " + str(ret))
60-
logger.info("exit: getEdgeTargetVertexType (single target)")
60+
logger.debug("exit: getEdgeTargetVertexType (single target)")
6161

6262
return ret
6363

@@ -70,7 +70,7 @@ def _parse_get_edge_target_vertex_type(edgeTypeDetails):
7070

7171
if logger.level == logging.DEBUG:
7272
logger.debug("return: " + str(vts))
73-
logger.info("exit: getEdgeTargetVertexType (multi target)")
73+
logger.debug("exit: getEdgeTargetVertexType (multi target)")
7474

7575
return vts
7676
else:
@@ -126,7 +126,7 @@ def _parse_get_edge_count_from(res, edgeType):
126126

127127
if logger.level == logging.DEBUG:
128128
logger.debug("return: " + str(ret))
129-
logger.info("exit: getEdgeCountFrom (single edge type)")
129+
logger.debug("exit: getEdgeCountFrom (single edge type)")
130130

131131
return ret
132132

@@ -447,7 +447,7 @@ def edgeSetToDataFrame(edgeSet: list,
447447
ID or source and target vertices, and the edge type.
448448
449449
"""
450-
logger.info("entry: edgeSetToDataFrame")
450+
logger.debug("entry: edgeSetToDataFrame")
451451
logger.debug("params: " + str(locals()))
452452

453453
try:
@@ -469,6 +469,6 @@ def edgeSetToDataFrame(edgeSet: list,
469469

470470
if logger.level == logging.DEBUG:
471471
logger.debug("return: " + str(ret))
472-
logger.info("exit: edgeSetToDataFrame")
472+
logger.debug("exit: edgeSetToDataFrame")
473473

474474
return ret

pyTigerGraph/common/gsql.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ def clean_res(resp: list) -> str:
5656

5757
if logger.level == logging.DEBUG:
5858
logger.debug("return: " + str(ret))
59-
logger.info("exit: gsql (success)")
59+
logger.debug("exit: gsql (success)")
6060

6161
return string_without_ansi
6262

pyTigerGraph/common/loading.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ def _prep_run_loading_job_with_file(filePath):
1515
return data
1616
except OSError as ose:
1717
logger.error(ose.strerror)
18-
logger.info("exit: runLoadingJobWithFile")
18+
logger.debug("exit: runLoadingJobWithFile")
1919

2020
return None
2121
# TODO Should throw exception instead?

pyTigerGraph/common/path.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ def parse_vertices(vertices: Union[dict, tuple, list]) -> list:
6060
Returns:
6161
A list of vertices in the format required by the path finding endpoints.
6262
"""
63-
logger.info("entry: parseVertices")
63+
logger.debug("entry: parseVertices")
6464
logger.debug("params: " + str(locals))
6565

6666
ret = []
@@ -78,7 +78,7 @@ def parse_vertices(vertices: Union[dict, tuple, list]) -> list:
7878

7979
if logger.level == logging.DEBUG:
8080
logger.debug("return: " + str(ret))
81-
logger.info("exit: parseVertices")
81+
logger.debug("exit: parseVertices")
8282

8383
return ret
8484

@@ -94,7 +94,7 @@ def parse_filters(filters: Union[dict, tuple, list]) -> list:
9494
Returns:
9595
A list of filters in the format required by the path finding endpoints.
9696
"""
97-
logger.info("entry: parseFilters")
97+
logger.debug("entry: parseFilters")
9898
logger.debug("params: " + str(locals()))
9999

100100
ret = []
@@ -111,11 +111,11 @@ def parse_filters(filters: Union[dict, tuple, list]) -> list:
111111
logger.warning("Invalid filter type or value: " + str(f))
112112

113113
logger.debug("return: " + str(ret))
114-
logger.info("exit: parseFilters")
114+
logger.debug("exit: parseFilters")
115115

116116
return ret
117117

118-
logger.info("entry: _preparePathParams")
118+
logger.debug("entry: _preparePathParams")
119119
logger.debug("params: " + str(locals()))
120120

121121
# Assembling the input payload
@@ -136,6 +136,6 @@ def parse_filters(filters: Union[dict, tuple, list]) -> list:
136136
ret = json.dumps(data)
137137

138138
logger.debug("return: " + str(ret))
139-
logger.info("exit: _preparePathParams")
139+
logger.debug("exit: _preparePathParams")
140140

141141
return ret

pyTigerGraph/common/query.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ def _parse_query_parameters(params: dict) -> str:
5454
"key": [([p_id1, p_id2, ...], "vtype"), ...]
5555
I.e. multiple primary IDs of the same vertex type
5656
"""
57-
logger.info("entry: _parseQueryParameters")
57+
logger.debug("entry: _parseQueryParameters")
5858
logger.debug("params: " + str(params))
5959

6060
ret = ""
@@ -76,7 +76,7 @@ def _parse_query_parameters(params: dict) -> str:
7676
k + "[" + str(i) + "].type=" + vv[1] + "&"
7777
else:
7878
raise TigerGraphException(
79-
"Invalid parameter value: (vertex_primary_id , vertex_type)"
79+
"Invalid parameter value: (vertex_primary_id, vertex_type)"
8080
" was expected.")
8181
else:
8282
ret += k + "=" + _safe_char(vv) + "&"
@@ -86,11 +86,12 @@ def _parse_query_parameters(params: dict) -> str:
8686
_safe_char(v.strftime("%Y-%m-%d %H:%M:%S")) + "&"
8787
else:
8888
ret += k + "=" + _safe_char(v) + "&"
89-
ret = ret[:-1]
89+
if ret:
90+
ret = ret[:-1]
9091

9192
if logger.level == logging.DEBUG:
9293
logger.debug("return: " + str(ret))
93-
logger.info("exit: _parseQueryParameters")
94+
logger.debug("exit: _parseQueryParameters")
9495

9596
return ret
9697

0 commit comments

Comments
 (0)