You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by ca...@codespot.com on 2012/01/11 18:04:56 UTC

[cassandra-node] 3 new revisions pushed by gdusbabek@gmail.com on 2012-01-11 17:04 GMT

3 new revisions:

Revision: 974a3f8382e8
Author:   gdusbabek <gd...@gmail.com>
Date:     Wed Jan 11 09:01:40 2012
Log:      detect select count(*) and decode appropriately.
http://code.google.com/a/apache-extras.org/p/cassandra-node/source/detail?r=974a3f8382e8

Revision: 474e16d83307
Author:   Gary Dusbabek <gd...@gmail.com>
Date:     Wed Jan 11 08:05:25 2012
Log:      export bufferToHex and tests to show that binary cols/keys work
http://code.google.com/a/apache-extras.org/p/cassandra-node/source/detail?r=474e16d83307

Revision: 252c01c314aa
Author:   Gary Dusbabek <gd...@gmail.com>
Date:     Wed Jan 11 09:03:09 2012
Log:      Merge branch '25/select_count'
http://code.google.com/a/apache-extras.org/p/cassandra-node/source/detail?r=252c01c314aa

==============================================================================
Revision: 974a3f8382e8
Author:   gdusbabek <gd...@gmail.com>
Date:     Wed Jan 11 09:01:40 2012
Log:      detect select count(*) and decode appropriately.

http://code.google.com/a/apache-extras.org/p/cassandra-node/source/detail?r=974a3f8382e8

Modified:
  /lib/decoder.js
  /lib/driver.js
  /test/test_driver.js

=======================================
--- /lib/decoder.js	Tue Jan 10 11:15:10 2012
+++ /lib/decoder.js	Wed Jan 11 09:01:40 2012
@@ -129,6 +129,9 @@
    },
    'org.apache.cassandra.db.marshal.LexicalUUIDType': function(bytes) {
      return converters['org.apache.cassandra.db.marshal.UUIDType'](bytes);
+  },
+  'select count': function(bytes) {
+    return converters['org.apache.cassandra.db.marshal.LongType'](bytes);
    }
  };

@@ -162,7 +165,9 @@
    } else if (which == 'comparator') {
      className = this.validators.comparator;
    } else if (which == 'validator') {
-    if (column && this.validators.specificValidators[column]) {
+    if (this.options.select_count) {
+      className = 'select count';
+    } else if (column && this.validators.specificValidators[column]) {
        className = this.validators.specificValidators[column];
      } else {
        className = this.validators.defaultValidator;
=======================================
--- /lib/driver.js	Mon Jan  9 03:12:55 2012
+++ /lib/driver.js	Wed Jan 11 09:01:40 2012
@@ -37,6 +37,7 @@

  // used to parse the CF name out of a select statement.
  var selectRe = /\s*SELECT\s+.+\s+FROM\s+[\']?(\w+)/im;
+var selectCountRe = /\s*SELECT\s+.*COUNT\(.+\)\s+FROM\s+[\']?(\w+)/im;

  var appExceptions =  
['InvalidRequestException', 'TimedOutException', 'UnavailableException',
    'SchemaDisagreementException'];
@@ -559,7 +560,8 @@
        } else {
          if (res.type === ttypes.CqlResultType.ROWS) {
            var cfName = selectRe.exec(cql)[1];
-          var decoder = new Decoder(self.validators[cfName], {use_bigints:  
self.connectionInfo.use_bigints});
+          var decoder = new Decoder(self.validators[cfName], {use_bigints:  
self.connectionInfo.use_bigints,
+                                                               
select_count: selectCountRe.test(cql)});
            // for now, return results.
            var rows = [];
            for (var i = 0; i < res.rows.length; i++) {
=======================================
--- /test/test_driver.js	Mon Jan  9 12:44:46 2012
+++ /test/test_driver.js	Wed Jan 11 09:01:40 2012
@@ -207,7 +207,8 @@
      function executeCountQuery(callback) {
        con.execute('SELECT COUNT(*) FROM CfLong', [], function(err, rows) {
          assert.ifError(err);
-        assert.equal(rows[0].cols[0].value, 5);
+        console.log(rows[0].cols);
+        assert.strictEqual(rows[0].cols[0].value, 5);
          callback();
        });
      },

==============================================================================
Revision: 474e16d83307
Author:   Gary Dusbabek <gd...@gmail.com>
Date:     Wed Jan 11 08:05:25 2012
Log:      export bufferToHex and tests to show that binary cols/keys work

http://code.google.com/a/apache-extras.org/p/cassandra-node/source/detail?r=474e16d83307

Added:
  /test/util.js
Modified:
  /lib/decoder.js
  /test/test_decoder.js
  /test/test_driver.js

=======================================
--- /dev/null
+++ /test/util.js	Wed Jan 11 08:05:25 2012
@@ -0,0 +1,23 @@
+
+// min is inclusive, max is exclusive.
+function randomInt(min, max) {
+  if (min === undefined) {
+    min = -2147483648;
+  }
+  if (max === undefined) {
+    max = 2147483647
+  }
+  return Math.round(Math.random() * (max - min) + min);
+}
+
+function randomBuffer(sz) {
+  sz = sz || randomInt(10, 100);
+  var buf = new Buffer(sz);
+  for (var i = 0; i < sz; i++) {
+    buf[i] = randomInt(0, 255);
+  }
+  return buf;
+}
+
+exports.randomInt = randomInt;
+exports.randomBuffer = randomBuffer;
=======================================
--- /lib/decoder.js	Tue Jan 10 11:15:10 2012
+++ /lib/decoder.js	Wed Jan 11 08:05:25 2012
@@ -63,6 +63,24 @@
    return bytesToBigInt(bytes);
  };

+// just what you think.
+function byteToHex(n) {
+  if (n < 16) {
+    return '0' + n.toString(16);
+  } else {
+    return n.toString(16);
+  }
+}
+
+/** convert a buffer to a hex string suitable for use in cql statements. */
+var bufferToString = module.exports.bufferToString = function(buf) {
+  var chars = [];
+  for (var i = 0; i < buf.length; i++) {
+    chars[i] = byteToHex(buf[i]);
+  }
+  return chars.join('');
+};
+
  // Cassandra datatypes according to
  // http://www.datastax.com/docs/1.0/ddl/column_family
  // Those commented out are not correctly dealt with yet and will appear as
=======================================
--- /test/test_decoder.js	Mon Jan  9 10:46:41 2012
+++ /test/test_decoder.js	Wed Jan 11 08:05:25 2012
@@ -19,6 +19,7 @@
  var BigInteger = require('../lib/bigint').BigInteger;
  var bytesToBigLong = require('../lib/decoder').bytesToBigLong;
  var bytesToNum = require('../lib/decoder').bytesToNum;
+var bufferToString = require('../lib/decoder').bufferToString;
  var UUID = require('../lib/uuid');

  function makeBuffer(string) {
@@ -242,3 +243,15 @@
    }
    test.finish();
  };
+
+exports.testHexing = function(test, assert) {
+  var buf = new Buffer(6);
+  buf[0] = 0x00;
+  buf[1] = 0x33;
+  buf[2] = 0x66;
+  buf[3] = 0x99;
+  buf[4] = 0xcc;
+  buf[5] = 0xff;
+  assert.strictEqual('00336699ccff', bufferToString(buf));
+  test.finish();
+};
=======================================
--- /test/test_driver.js	Mon Jan  9 12:44:46 2012
+++ /test/test_driver.js	Wed Jan 11 08:05:25 2012
@@ -34,6 +34,8 @@
  var KsDef = require('../lib/system').KsDef;
  var CfDef = require('../lib/system').CfDef;
  var UUID = require('../lib/driver').UUID;
+var util = require('./util');
+var decoder = require('../lib/decoder');

  var CASSANDRA_PORT = 19170;

@@ -429,6 +431,33 @@
    });
  };

+exports.testBinary = function(test, assert) {
+  connect(function(err, con) {
+    assert.ifError(err);
+    var key = 'binarytest';
+    var binaryParams = [util.randomBuffer(), util.randomBuffer(),  
util.randomBuffer()];
+    var stringParams = binaryParams.map(decoder.bufferToString);
+    con.execute('update CfBytes set ?=? where key=?', stringParams,  
function(updErr) {
+      if (updErr) {
+        con.close();
+        assert.ok(false);
+        test.finish();
+      } else {
+        con.execute('select ? from CfBytes where key=?', [stringParams[0],  
stringParams[2]], function(selErr, rows) {
+          con.close();
+          assert.strictEqual(rows.rowCount(), 1);
+          var row = rows[0];
+          console.log(row);
+          assert.strictEqual(row.key.toString('base64'),  
binaryParams[2].toString('base64'));
+          assert.strictEqual(row.cols[0].name.toString('base64'),  
binaryParams[0].toString('base64'));
+          assert.strictEqual(row.cols[0].value.toString('base64'),  
binaryParams[1].toString('base64'));
+          test.finish();
+        });
+      }
+    });
+  });
+};
+
  exports.testLong = function(test, assert) {
    connect(function(err, con) {
      if (err) {

==============================================================================
Revision: 252c01c314aa
Author:   Gary Dusbabek <gd...@gmail.com>
Date:     Wed Jan 11 09:03:09 2012
Log:      Merge branch '25/select_count'

http://code.google.com/a/apache-extras.org/p/cassandra-node/source/detail?r=252c01c314aa

Modified:
  /lib/decoder.js
  /test/test_driver.js

=======================================
--- /lib/decoder.js	Wed Jan 11 08:05:25 2012
+++ /lib/decoder.js	Wed Jan 11 09:03:09 2012
@@ -147,6 +147,9 @@
    },
    'org.apache.cassandra.db.marshal.LexicalUUIDType': function(bytes) {
      return converters['org.apache.cassandra.db.marshal.UUIDType'](bytes);
+  },
+  'select count': function(bytes) {
+    return converters['org.apache.cassandra.db.marshal.LongType'](bytes);
    }
  };

@@ -180,7 +183,9 @@
    } else if (which == 'comparator') {
      className = this.validators.comparator;
    } else if (which == 'validator') {
-    if (column && this.validators.specificValidators[column]) {
+    if (this.options.select_count) {
+      className = 'select count';
+    } else if (column && this.validators.specificValidators[column]) {
        className = this.validators.specificValidators[column];
      } else {
        className = this.validators.defaultValidator;
=======================================
--- /test/test_driver.js	Wed Jan 11 08:05:25 2012
+++ /test/test_driver.js	Wed Jan 11 09:03:09 2012
@@ -209,7 +209,8 @@
      function executeCountQuery(callback) {
        con.execute('SELECT COUNT(*) FROM CfLong', [], function(err, rows) {
          assert.ifError(err);
-        assert.equal(rows[0].cols[0].value, 5);
+        console.log(rows[0].cols);
+        assert.strictEqual(rows[0].cols[0].value, 5);
          callback();
        });
      },