Demo for query storing

Change-Id: I947bcac841992c3f6cfd01ab337c265b0d01cb70
diff --git a/node_modules/keyv/src/index.js b/node_modules/keyv/src/index.js
new file mode 100644
index 0000000..ab714b2
--- /dev/null
+++ b/node_modules/keyv/src/index.js
@@ -0,0 +1,99 @@
+'use strict';
+
+const EventEmitter = require('events');
+const JSONB = require('json-buffer');
+
+const loadStore = opts => {
+	const adapters = {
+		redis: '@keyv/redis',
+		mongodb: '@keyv/mongo',
+		mongo: '@keyv/mongo',
+		sqlite: '@keyv/sqlite',
+		postgresql: '@keyv/postgres',
+		postgres: '@keyv/postgres',
+		mysql: '@keyv/mysql'
+	};
+	if (opts.adapter || opts.uri) {
+		const adapter = opts.adapter || /^[^:]*/.exec(opts.uri)[0];
+		return new (require(adapters[adapter]))(opts);
+	}
+	return new Map();
+};
+
+class Keyv extends EventEmitter {
+	constructor(uri, opts) {
+		super();
+		this.opts = Object.assign(
+			{ namespace: 'keyv' },
+			(typeof uri === 'string') ? { uri } : uri,
+			opts
+		);
+
+		if (!this.opts.store) {
+			const adapterOpts = Object.assign({}, this.opts);
+			this.opts.store = loadStore(adapterOpts);
+		}
+
+		if (typeof this.opts.store.on === 'function') {
+			this.opts.store.on('error', err => this.emit('error', err));
+		}
+
+		this.opts.store.namespace = this.opts.namespace;
+	}
+
+	_getKeyPrefix(key) {
+		return `${this.opts.namespace}:${key}`;
+	}
+
+	get(key) {
+		key = this._getKeyPrefix(key);
+		const store = this.opts.store;
+		return Promise.resolve()
+			.then(() => store.get(key))
+			.then(data => {
+				data = (typeof data === 'string') ? JSONB.parse(data) : data;
+				if (data === undefined) {
+					return undefined;
+				}
+				if (typeof data.expires === 'number' && Date.now() > data.expires) {
+					this.delete(key);
+					return undefined;
+				}
+				return data.value;
+			});
+	}
+
+	set(key, value, ttl) {
+		key = this._getKeyPrefix(key);
+		if (typeof ttl === 'undefined') {
+			ttl = this.opts.ttl;
+		}
+		if (ttl === 0) {
+			ttl = undefined;
+		}
+		const store = this.opts.store;
+
+		return Promise.resolve()
+			.then(() => {
+				const expires = (typeof ttl === 'number') ? (Date.now() + ttl) : null;
+				value = { value, expires };
+				return store.set(key, JSONB.stringify(value), ttl);
+			})
+			.then(() => true);
+	}
+
+	delete(key) {
+		key = this._getKeyPrefix(key);
+		const store = this.opts.store;
+		return Promise.resolve()
+			.then(() => store.delete(key));
+	}
+
+	clear() {
+		const store = this.opts.store;
+		return Promise.resolve()
+			.then(() => store.clear());
+	}
+}
+
+module.exports = Keyv;