Demo for query storing

Change-Id: I947bcac841992c3f6cfd01ab337c265b0d01cb70
diff --git a/node_modules/ordered-read-streams/index.js b/node_modules/ordered-read-streams/index.js
new file mode 100644
index 0000000..61f3886
--- /dev/null
+++ b/node_modules/ordered-read-streams/index.js
@@ -0,0 +1,99 @@
+var Readable = require('readable-stream/readable');
+var util = require('util');
+
+function isReadable(stream) {
+  if (typeof stream.pipe !== 'function') {
+    return false;
+  }
+
+  if (!stream.readable) {
+    return false;
+  }
+
+  if (typeof stream._read !== 'function') {
+    return false;
+  }
+
+  if (!stream._readableState) {
+    return false;
+  }
+
+  return true;
+}
+
+function addStream (streams, stream) {
+  if (!isReadable(stream)) {
+    throw new Error('All input streams must be readable');
+  }
+
+  var self = this;
+
+  stream._buffer = [];
+
+  stream.on('readable', function () {
+    var chunk = stream.read();
+    while (chunk) {
+      if (this === streams[0]) {
+        self.push(chunk);
+      } else {
+        this._buffer.push(chunk);
+      }
+      chunk = stream.read();
+    }
+  });
+
+  stream.on('end', function () {
+    for (var stream = streams[0];
+      stream && stream._readableState.ended;
+      stream = streams[0]) {
+      while (stream._buffer.length) {
+        self.push(stream._buffer.shift());
+      }
+
+      streams.shift();
+    }
+
+    if (!streams.length) {
+      self.push(null);
+    }
+  });
+
+  stream.on('error', this.emit.bind(this, 'error'));
+
+  streams.push(stream);
+}
+
+function OrderedStreams (streams, options) {
+  if (!(this instanceof(OrderedStreams))) {
+    return new OrderedStreams(streams, options);
+  }
+
+  streams = streams || [];
+  options = options || {};
+
+  options.objectMode = true;
+
+  Readable.call(this, options);
+
+  if (!Array.isArray(streams)) {
+    streams = [streams];
+  }
+  if (!streams.length) {
+    return this.push(null);  // no streams, close
+  }
+
+  var addStreamBinded = addStream.bind(this, []);
+
+  streams.forEach(function (item) {
+    if (Array.isArray(item)) {
+      item.forEach(addStreamBinded);
+    } else {
+      addStreamBinded(item);
+    }
+  });
+}
+util.inherits(OrderedStreams, Readable);
+
+OrderedStreams.prototype._read = function () {};
+
+module.exports = OrderedStreams;