Edward Capriolo created CASSANDRA-6704:
------------------------------------------
Summary: Create wide row scanners
Key: CASSANDRA-6704
URL: https://issues.apache.org/jira/browse/CASSANDRA-6704
Project: Cassandra
Issue Type: New Feature
Reporter: Edward Capriolo
Assignee: Edward Capriolo
The BigTable white paper demonstrates the use of scanners to iterate over rows
and columns.
http://static.googleusercontent.com/media/research.google.com/en/us/archive/bigtable-osdi06.pdf
Because Cassandra does not have a primary sorting on row keys scanning over
ranges of row keys is less useful.
However we can use the scanner concept to operate on wide rows. For example
many times a user wishes to do some custom processing inside a row and does not
wish to carry the data across the network to do this processing.
I have already implemented thrift methods to compile dynamic groovy code into
Filters as well as some code that uses a Filter to page through and process
data on the server side.
https://github.com/edwardcapriolo/cassandra/compare/apache:trunk...trunk
The following is a working code snippet.
{code}
@Test
public void test_scanner() throws Exception
{
ColumnParent cp = new ColumnParent();
cp.setColumn_family("Standard1");
ByteBuffer key = ByteBuffer.wrap("rscannerkey".getBytes());
for (char a='a'; a < 'g'; a++){
Column c1 = new Column();
c1.setName((a+"").getBytes());
c1.setValue(new byte [0]);
c1.setTimestamp(System.nanoTime());
server.insert(key, cp, c1, ConsistencyLevel.ONE);
}
FilterDesc d = new FilterDesc();
d.setSpec("GROOVY_CLASS_LOADER");
d.setName("limit3");
d.setCode("import org.apache.cassandra.dht.* \n" +
"import org.apache.cassandra.thrift.* \n" +
"public class Limit3 implements SFilter { \n " +
"public FilterReturn filter(ColumnOrSuperColumn col,
List<ColumnOrSuperColumn> filtered) {\n"+
" filtered.add(col);\n"+
" return filtered.size()< 3 ? FilterReturn.FILTER_MORE :
FilterReturn.FILTER_DONE;\n"+
"} \n" +
"}\n");
server.create_filter(d);
ScannerResult res = server.create_scanner("Standard1", "limit3", key,
ByteBuffer.wrap("a".getBytes()));
Assert.assertEquals(3, res.results.size());
}
{code}
I am going to be working on this code over the next few weeks but I wanted to
get the concept our early so the design can see some criticism.
--
This message was sent by Atlassian JIRA
(v6.1.5#6160)