Skip to content

Commit dffa8d1

Browse files
committed
Included summary stats
1 parent f71dd71 commit dffa8d1

File tree

2 files changed

+75
-21
lines changed

2 files changed

+75
-21
lines changed

neo4j/__main__.py

Lines changed: 25 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ def main():
8383
parser.add_argument("-s", "--secure", action="store_true")
8484
parser.add_argument("-v", "--verbose", action="count")
8585
parser.add_argument("-x", "--times", type=int, default=1)
86+
parser.add_argument("-z", "--summarize", action="store_true")
8687
args = parser.parse_args()
8788

8889
if args.verbose:
@@ -102,24 +103,30 @@ def main():
102103

103104
driver = GraphDatabase.driver(args.url, secure=args.secure)
104105
session = driver.session()
105-
if session:
106-
for _ in range(args.times):
107-
for statement in args.statement:
108-
try:
109-
records = session.run(statement, parameters)
110-
except CypherError as error:
111-
stderr.write("%s: %s\r\n" % (error.code, error.message))
112-
else:
113-
if not args.quiet:
114-
has_results = False
115-
for i, record in enumerate(records):
116-
has_results = True
117-
if i == 0:
118-
stdout.write("%s\r\n" % "\t".join(record.__keys__))
119-
stdout.write("%s\r\n" % "\t".join(map(repr, record)))
120-
if has_results:
121-
stdout.write("\r\n")
122-
session.close()
106+
for _ in range(args.times):
107+
for statement in args.statement:
108+
try:
109+
result = session.run(statement, parameters)
110+
except CypherError as error:
111+
stderr.write("%s: %s\r\n" % (error.code, error.message))
112+
else:
113+
if not args.quiet:
114+
has_results = False
115+
for i, record in enumerate(result):
116+
has_results = True
117+
if i == 0:
118+
stdout.write("%s\r\n" % "\t".join(record.__keys__))
119+
stdout.write("%s\r\n" % "\t".join(map(repr, record)))
120+
if has_results:
121+
stdout.write("\r\n")
122+
if args.summarize:
123+
summary = result.summarize()
124+
stdout.write("Statement : %r\r\n" % summary.statement)
125+
stdout.write("Parameters : %r\r\n" % summary.parameters)
126+
stdout.write("Statement Type : %r\r\n" % summary.statement_type)
127+
stdout.write("Statistics : %r\r\n" % summary.statistics)
128+
stdout.write("\r\n")
129+
session.close()
123130

124131

125132
if __name__ == "__main__":

neo4j/session.py

Lines changed: 50 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,12 @@ class which can be used to obtain `Driver` instances that are used for
3636
from .typesystem import hydrated
3737

3838

39+
STATEMENT_TYPE_READ_ONLY = "r"
40+
STATEMENT_TYPE_READ_WRITE = "rw"
41+
STATEMENT_TYPE_WRITE_ONLY = "w"
42+
STATEMENT_TYPE_SCHEMA_WRITE = "sw"
43+
44+
3945
Latency = namedtuple("Latency", ["overall", "network", "wait"])
4046

4147

@@ -98,11 +104,14 @@ def session(self, **config):
98104

99105
class Result(list):
100106

101-
def __init__(self, session):
102-
self.session = session
107+
def __init__(self, session, statement, parameters):
103108
super(Result, self).__init__()
109+
self.session = session
110+
self.statement = statement
111+
self.parameters = parameters
104112
self.keys = None
105113
self.complete = False
114+
self.summary = None
106115
self.bench_test = None
107116

108117
def on_header(self, metadata):
@@ -115,6 +124,8 @@ def on_record(self, values):
115124

116125
def on_footer(self, metadata):
117126
self.complete = True
127+
self.summary = ResultSummary(self.statement, self.parameters,
128+
metadata.get("type"), metadata.get("stats"))
118129
if self.bench_test:
119130
self.bench_test.end_recv = perf_counter()
120131

@@ -126,6 +137,42 @@ def consume(self):
126137
while not self.complete:
127138
fetch_next()
128139

140+
def summarize(self):
141+
self.consume()
142+
return self.summary
143+
144+
145+
class ResultSummary(object):
146+
147+
def __init__(self, statement, parameters, statement_type, statistics):
148+
self.statement = statement
149+
self.parameters = parameters
150+
self.statement_type = statement_type
151+
self.statistics = StatementStatistics(statistics or {})
152+
153+
154+
class StatementStatistics(object):
155+
contains_updates = False
156+
nodes_created = 0
157+
nodes_deleted = 0
158+
relationships_created = 0
159+
relationships_deleted = 0
160+
properties_set = 0
161+
labels_added = 0
162+
labels_removed = 0
163+
indexes_added = 0
164+
indexes_removed = 0
165+
constraints_added = 0
166+
constraints_removed = 0
167+
168+
def __init__(self, statistics):
169+
for key, value in dict(statistics).items():
170+
key = key.replace("-", "_")
171+
setattr(self, key, value)
172+
173+
def __repr__(self):
174+
return repr(vars(self))
175+
129176

130177
class Session(object):
131178
""" Logical session carried out over an established TCP connection.
@@ -162,7 +209,7 @@ def run(self, statement, parameters=None):
162209
t = BenchTest()
163210
t.init = perf_counter()
164211

165-
result = Result(self)
212+
result = Result(self, statement, parameters)
166213
result.bench_test = t
167214

168215
run_response = Response(self.connection)

0 commit comments

Comments
 (0)