From d03663ec55d9d14694a0f6e540dec0a77a91de66 Mon Sep 17 00:00:00 2001
From: davebshow <davebshow@gmail.com>
Date: Tue, 5 Jul 2016 19:57:13 -0400
Subject: [PATCH] return goblin responses 1 by 1

---
 goblin/query.py      | 30 ++++++++++++++++--------------
 tests/test_engine.py |  4 ++--
 2 files changed, 18 insertions(+), 16 deletions(-)

diff --git a/goblin/query.py b/goblin/query.py
index 1b0fdc1..03c4537 100644
--- a/goblin/query.py
+++ b/goblin/query.py
@@ -1,4 +1,5 @@
 """Query API and helpers"""
+import collections
 import logging
 from goblin import mapper
 
@@ -17,25 +18,26 @@ class AsyncQueryResponseIter:
     def __init__(self, async_iter, query):
         self._async_iter = async_iter
         self._query = query
+        self._queue = collections.deque()
 
     async def __aiter__(self):
         return self
 
     async def __anext__(self):
-        msg = await self._async_iter.fetch_data()
-        if msg:
-            results = msg.data
-            processed_results = []
-            for result in results:
-                current = self._query.session.current.get(result['id'], None)
-                if not current:
-                    current = self._query._element_class()
-                element = self._query._mapper(result, current,
-                                              current.__mapping__)
-                processed_results.append(element)
-            return processed_results
-        else:
-            raise StopAsyncIteration
+        if not self._queue:
+            msg = await self._async_iter.fetch_data()
+            if msg:
+                results = msg.data
+                for result in results:
+                    current = self._query.session.current.get(result['id'], None)
+                    if not current:
+                        current = self._query._element_class()
+                    element = self._query._mapper(result, current,
+                                                  current.__mapping__)
+                    self._queue.append(element)
+            else:
+                raise StopAsyncIteration
+        return self._queue.popleft()
 
 
 class Query:
diff --git a/tests/test_engine.py b/tests/test_engine.py
index 42f4090..597d49b 100644
--- a/tests/test_engine.py
+++ b/tests/test_engine.py
@@ -139,8 +139,8 @@ class TestEngine(unittest.TestCase):
             results = []
             stream = await session.query(TestVertex).all()
             async for msg in stream:
-                    results += msg
-                    print(len(results))
+                results.append(msg)
+                print(len(results))
             self.assertEqual(len(session.current), 2)
             for result in results:
                 self.assertIsInstance(result, Vertex)
-- 
GitLab