Skip to content

Couchbase support #7

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 8 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
759 changes: 642 additions & 117 deletions package-lock.json

Large diffs are not rendered by default.

3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
"dependencies": {
"chai": "^4.1.0",
"commander": "^2.11.0",
"couchbase": "^2.3.5",
"mocha": "^3.2.0",
"mocha-testcheck": "^1.0.0-rc.0",
"mongodb": "^2.2.30",
Expand All @@ -34,6 +35,6 @@
"redis": "^2.7.1",
"request": "^2.81.0",
"simple-rate-limiter": "^0.2.3",
"testcheck": "^1.0.0-rc.2"
"uuid": "^3.1.0"
}
}
5 changes: 3 additions & 2 deletions src/Nodes/FunctionNode.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,8 @@ const supportedTypes = {
"MySQL" : require('./FunctionNodes/MySQLDriver/MySQLNode'),
"Http" : require('./FunctionNodes/HttpDriver/HttpNode'),
"Redis" : require('./FunctionNodes/RedisDriver/RedisNode'),
"MongoDB" : require('./FunctionNodes/MongoDBDriver/MongoDBNode')
"MongoDB" : require('./FunctionNodes/MongoDBDriver/MongoDBNode'),
"Couchbase" : require('./FunctionNodes/CouchbaseDriver/CouchbaseNode')
};

const SEP_CHAR = '.';
Expand Down Expand Up @@ -193,4 +194,4 @@ let ops = {

fn.eval({}, ops)
.then((res) => {console.log(JSON.stringify(res))})
.catch((err) => {console.warn(JSON.stringify(err))});*/
.catch((err) => {console.warn(JSON.stringify(err))});*/
56 changes: 56 additions & 0 deletions src/Nodes/FunctionNodes/CouchbaseDriver/CouchbaseNode.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
const SEP_CHAR = '.';

const couchbase = require('couchbase');

const functions = {
find: require("./functions/find"),
count: require("./functions/count"),
insert: require("./functions/insert"),
update: require("./functions/update")
};

global._couchbase_clients = {};
function getClient(DBConfigs) {
return new Promise((resolve, reject) => {
if (global._couchbase_clients.hasOwnProperty(DBConfigs.bucket)) {
resolve(global._couchbase_clients[bucket]);
} else {
global._couchbase_clients = (new couchbase.Cluster(DBConfigs.url)).openBucket(DBConfigs.bucket);
resolve(global._couchbase_clients);
}
});
}

class CouchbaseNode {
constructor(name, children, args) {
this.name = name;
this.args = args;
this.children = children;
}

getName() {
return this.name;
}

//noinspect JSAnnotator
async eval(context, opts) {
const tokenizedName = this.name.split(SEP_CHAR);
const [ dbtype, DBName, bucket, operation ] = tokenizedName;

if (!functions.hasOwnProperty(operation)) {
throw `Operation Error: operation ${operation} does not exist / is not supported`;
}

if (!opts.hasOwnProperty('Couchbase')) {
throw `Missing configs: Couchbase settings are missing`;
} else if (!opts['Couchbase'].hasOwnProperty(DBName)) {
throw `Missing configs: Couchbase settings for DB ${DBName} are missing`;
}
const DBConfigs = opts['Couchbase'][DBName];
const db = await getClient(bucket, DBConfigs);

return await functions[operation](bucket, db, this.args);
}
}

module.exports = CouchbaseNode;
17 changes: 17 additions & 0 deletions src/Nodes/FunctionNodes/CouchbaseDriver/functions/count.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
const queryString = require("../utils/queryStringGenerator");
const N1qlQuery = require("couchbase").N1qlQuery;

module.exports = (bucket, db, { WHERE, KEY }) => {
return new Promise((resolve, reject) => {
const whereStr = WHERE ? `WHERE ${queryString(WHERE)}` : "";
const keyStr = KEY ? `USE KEYS "${KEY}"` : "";
const statement = [whereStr, keyStr].reduce((acc, str) => {
return acc += ` ${str || ""}`;
}, `SELECT COUNT(*) AS COUNT FROM ${bucket}`);
const query = N1qlQuery.fromString(statement);
db.query(query, (error, result) => {
if (error) return reject(error);
return resolve(result);
});
});
};
17 changes: 17 additions & 0 deletions src/Nodes/FunctionNodes/CouchbaseDriver/functions/find.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
const queryString = require("../utils/queryStringGenerator");
const N1qlQuery = require("couchbase").N1qlQuery;

module.exports = (bucket, db, { WHERE, KEY }) => {
return new Promise((resolve, reject) => {
const whereStr = WHERE ? `WHERE ${queryString(WHERE)}` : "";
const keyStr = KEY ? `USE KEYS "${KEY}"` : "";
const statement = [whereStr, keyStr].reduce((acc, str) => {
return acc + ` ${str || ""}`;
}, `SELECT META(${bucket}).id, ${bucket}.* FROM ${bucket}`);
const query = N1qlQuery.fromString(statement);
db.query(query, (error, result) => {
if (error) return reject(error);
return resolve(result);
});
});
};
14 changes: 14 additions & 0 deletions src/Nodes/FunctionNodes/CouchbaseDriver/functions/insert.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
const queryString = require("../utils/queryStringGenerator");
const N1qlQuery = require('couchbase').N1qlQuery;
const uuidv1 = require("uuid/v1");

module.exports = (bucket, db, { docid = uuidv1(), data = {} }) => {
return new Promise((resolve, reject) => {
const statement = `INSERT INTO ${bucket} ( KEY, VALUE ) VALUES ( "${docid}", ${JSON.stringify(data)} ) RETURNING META(default).id, default.*`;
const query = N1qlQuery.fromString(statement);
db.query(query, (error, result) => {
if (error) return reject(error);
return resolve(result[0]);
});
});
};
20 changes: 20 additions & 0 deletions src/Nodes/FunctionNodes/CouchbaseDriver/functions/update.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
const queryString = require("../utils/queryStringGenerator");
const N1qlQuery = require('couchbase').N1qlQuery;
const uuidv1 = require("uuid/v1");

module.exports = (bucket, db, { KEY, WHERE, SET }) => {
return new Promise((resolve, reject) => {
const whereStr = WHERE ? `WHERE ${queryString(WHERE)}` : "";
const keyStr = KEY ? `USE KEYS "${KEY}"` : "";
const setStr = `SET ${queryString(SET)}`;
const statement =
[keyStr, setStr, whereStr, `RETURNING ${bucket}.*`].reduce((acc, str) => {
return acc += ` ${str || ""}`;
}, `UPDATE ${bucket}`);
const query = N1qlQuery.fromString(statement);
db.query(query, (error, result) => {
if (error) return reject(error);
return resolve(result[0]);
});
});
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
module.exports = (obj) => {
if (!obj) return "";
return Object.keys(obj).map(val => `${val} = "${obj[val]}"`).join("AND");
};
2 changes: 1 addition & 1 deletion src/Nodes/FunctionNodes/MySQLDriver/utils.js
Original file line number Diff line number Diff line change
Expand Up @@ -51,4 +51,4 @@ function objValues(obj) {
module.exports.removeSpecialArgs = removeSpecialArgs;
module.exports.isNumberParseable = isNumberParseable;
module.exports.quoteAsNeeded = quoteAsNeeded;
module.exports.objValues = objValues;
module.exports.objValues = objValues;