On Thu, Jun 27, 2013 at 4:26 AM, Ian Boston <i...@tfd.co.uk> wrote: > On 27 June 2013 02:34, Dishara Wijewardana <ddwijeward...@gmail.com> > wrote: > > > On Tue, Jun 25, 2013 at 4:52 AM, Ian Boston <i...@tfd.co.uk> wrote: > > > > > Hi, > > > > > > (I might have errors in the CQL, Cassandra schema and the functions > need > > > proper escaping) > > > > > > > > > Example 1: > > > Zero depth tree wiht UUID as the rowid or key. > > > > > > URL /content/cassandra/pictures/13f58d5c95c70b6f > > > > > > then the column family is pictures and the URL -> ROWID function just > > > results in the ROWID being 13f58d5c95c70b6f and > > > > > > String cql = mapOfCassandraMappers.get("pictures").getCQL("pictures", " > > > 13f58d5c95c70b6f") > > > System.err.println(cql); > > > > > > where > > > String getCQL(String cf, String path) { > > > return "select * from "+cf+" where rowid = '"+path+"'"; > > > } > > > > > > yields: > > > select * from pictures where rowid = '13f58d5c95c70b6f' > > > > > > > > > 13f58d5c95c70b6f would be generated by the application when the user > > > created a new picture (by upload). > > > > > > > > > > > > Example 2: > > > User specified > > > > > > URL /content/cassandra/catalogue/capacitors/electrolytic/axial/16v/10uf > > > > > > String cql = > mapOfCassandraMappers.get("catalogue").getCQL("catalogue", " > > > capacitors/electrolytic/axial/16v/10uf") > > > System.err.println(cql); > > > > > > where > > > String getCQL(String cf, String path) { > > > MessageDigest md = MessageDigest.getInstance("SHA1"); > > > String rowID = Base64.encode(md.finish(path.getBytes("UTF-8"))); > > > return "select * from "+cf+" where rowid = '"+rowID+"'"; > > > } > > > > > > yields > > > > > > select * from pictures where rowid = 'NzdlZmU4OTZmNGM4MzMwYzZ' > > > > > > If you want to find the parent then > > > > > > mapOfCassandraMappers.get("catalogue").getCQL("catalogue", " > > > capacitors/electrolytic/axial/16v") > > > > > > select * from pictures where rowid = 'ZGFzZGZzZnNkYWZzYWRmc2R' > > > > > > And if the parent is stored in the property parent then > > > > > > select * from pictures where parent = 'ZGFzZGZzZnNkYWZzYWRmc2R' > > > > > > will generate a list of children. (Not sure about performance) > > > > > > > > > Example 3: > > > User is allowed to enter the RowID directly (identical to Example 1 > > > URL > > > > > > > > > /content/cassandra/cannesfilmfestival/TomCruiseCassino-20130402112345-ieb.jpg > > > > > > where > > > String getCQL(String cf, String path) { > > > return "select * from "+cf+" where rowid = '"+path+"'"; > > > } > > > > > > yields: > > > select * from pictures where rowid = ' > > > TomCruiseCassino-20130402112345-ieb.jpg' > > > > > > > This should be corrected as > > select * from cannesfilmfestival where rowid = ' > > TomCruiseCassino-20130402112345-ieb.jpg' > > > > > > > > > > > > > Does that make sense ? > > > > > > > Hi > > > > Hi Ian, > > I was in fact practicing some cql stuff in related to this response (with > > cassandra cql terminal). This is quite a wonderful explanation for a new > > comer like me. Thank you very much for the explanation again. Now it > really > > makes sense. > > > > excellent! > > > > > > Other than the zero depth approach, I believe users will be more > > comfortable with Example 2 approach. > > Shall we go ahead with it ? > > > > > Yes, go for it. It will be interesting to see how hard it is to implement > and how well (or not) it works. Remember, keep it as simple as possible and > dont try and and cover every use case at the expense of getting a PoC > working. > +1.
> > However, dont forget, Unit tests mocked with Mockito are a quicker way of > getting to working code, than no unit test coverage. > > Best Regards > Ian > > > > > > > > > > > Ian > > > > > > > > > > > > > > > On 25 June 2013 05:29, Dishara Wijewardana <ddwijeward...@gmail.com> > > > wrote: > > > > > > > On Mon, Jun 24, 2013 at 4:02 AM, Ian Boston <i...@tfd.co.uk> wrote: > > > > > > > > > Hi Dishara, > > > > > Yes. 1 resource == 1 row. > > > > > The columns within that row represent the properties of the > resource. > > > > > I suggest that you use standard property names where appropriate > (eg > > > > > sling:resourceType is the Resource.resourceType etc) > > > > > > > > > > The Resource itself should be adaptable to a generic > > CassandraResource > > > > > (which will probably implement Resource) which will have a map of > > > > > properties containing all the columns of the cassandra row. > (optimise > > > > > later) A CassandraResource might look and feel like a Map<String, > > > Object> > > > > > or it might have a Map<String, Object> getProperties() method, or > > > better > > > > > still be adaptable to a Map. The essential think is dont hard code > > the > > > > > property names in the interface of CassandraResource for the > moment. > > ie > > > > no > > > > > getContentType() and no getMimeType(), as we dont really know what > a > > > > > CassandraResource will store. > > > > > > > > > > ResourceMetadata should be built from a subset of the > > CassandraResource > > > > > properties. > > > > > > > > > > You won't need to implement a ResourceResolver, only a > > ResourceProvider > > > > > (and Factory). I would use CQL in preference to other API methods. > > > > > > > > > > There is one thing that hasnt been mentioned, and thats the URL -> > > > > > Cassandra Row mapping. > > > > > There are several ways of doing this. > > > > > > > > > > eg: > > > > > URL = /content/cassandra/<columnFamily>/<rowID> > > > > > Cassandra Column Family = columnFamily > > > > > Cassandra RowID = rowID > > > > > or > > > > > URL = > /content/cassandra/<columnFamilySelector>/remainder/of/the/path > > > > > Cassandra Cassandra Column Family = > > > > > mapOfColumnFamilies.get(columnFamilySelector) > > > > > Cassandra RowID = function(/remainder/of/the/path) > > > > > > > > > > or to take that one stage further > > > > > > > > > > public interface CassandraMapper { > > > > > String getCQL(String columnFamilySelector, String path); > > > > > } > > > > > > > > > Hi Ian > > > > Thank you for the detailed explanation. > > > > > > > > OK. +1 for this approach with the mentioned flexibility.But I need a > > > small > > > > clarification. With this approach, > > > > > > > > URL = /content/cassandra/<columnFamilySelector>ROW-ID > > > > ROW-ID - function(/remainder/of/the/path). > > > > So you mean ROW-ID is something we have to programatically uniquely > > > create > > > > right ? like a UUID. > > > > > > > > What is this "/remainder/of/the/path" means ? Can you give an example > > > with > > > > real values in the context of a user who want to obtain a resource > from > > > > cassandra. > > > > This is just for my understanding. > > > > > > > > > > > > > > > > > > > > > > URL = /content/cassandra/<columnFamilySelector>/<remainderOfPath> > > > > > > > > > > String cqlQuery = > > > > > > > > > > > > > > > > > > > > mapOfCassandraMappers.get(columnFamilySelector).getCQL(columnFamilySelector, > > > > > remainderOfPath); > > > > > > > > > > Which would allow us provided one or more implementations of > > > > > CassandraMapper to map between URL and CQL. > > > > > > > > > > > > > > > HTH > > > > > Ian > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > On 23 June 2013 19:29, Dishara Wijewardana < > ddwijeward...@gmail.com> > > > > > wrote: > > > > > > > > > > > Hi Ian, > > > > > > > > > > > > What is the data mapping should be between Cassandra and Sling > > > > resource. > > > > > I > > > > > > mean is a Sling Resource maps to a Cassandra Column ? Or Column > > > Family > > > > ? > > > > > > > > > > > > Because to get this Cassandra and Sling story correct we need to > > > > finalize > > > > > > this. > > > > > > For an example what we eventually returns is a Sling resource. > > > > Everything > > > > > > that needs to fill in to create Sling resource should be stored > in > > > > > > Cassandra. > > > > > > In a Sling resource, > > > > > > > > > > > > - Path - direct sling resource path > > > > > > - ResourceType - nt:cassandra > > > > > > - ResourceSuperType - ? > > > > > > - ResourceMetadata - we can create this on the fly with the > data > > > > from > > > > > > the corresponding column. At insertion, those need to be > stored. > > > > > > Following > > > > > > are the ones which I thought might be useful by default to be > > set > > > > for > > > > > > any > > > > > > node. Please add if we need anything more. > > > > > > - ContentType > > > > > > - ContentLength > > > > > > - CreationTime > > > > > > - ModificationTime > > > > > > - ResourceResolver - Do we need a resolver in this case ? > > > > > > > > > > > > > > > > > > So I believe in CQL context, one ROW should represent a Sling > > > > resource. > > > > > If > > > > > > that is the case for ResourceMetadata we might need a separate > > column > > > > to > > > > > > store it since it has multiple values. I am not sure whether we > can > > > do > > > > it > > > > > > with CQL, but it should be possible with hector APIs may be. > > > > > > > > > > > > Appreciate your thoughts ? > > > > > > > > > > > > > > > > > > On Wed, Jun 19, 2013 at 1:19 AM, Dishara Wijewardana < > > > > > > ddwijeward...@gmail.com> wrote: > > > > > > > > > > > > > Hi Ian, > > > > > > > I am starting this thread to keep track on things related to > the > > > GSoC > > > > > > > project related milestone status updates and related > discussions. > > > > > > > So the first task over view will be as follows as per GSoC > > proposal > > > > > > > provided. > > > > > > > > > > > > > > 1. Implementing a CassandraResourceProvider to READ from > > > Cassandra. > > > > > > > Implementation Details [1] > > > > > > > > > > > > > > > > > > > > > > > > > > > > [1] : Implementation Details: > > > > > > > > > > > > > > 1.A) Write a CassanrdaResourceProviderUtil which is > basically a > > > > > > > cassendra client which will facilitate all cassandra related > > > > operations > > > > > > > required by other modules (CassandraResourceProvider and > > > > > > > CassandraResourceResolver). > > > > > > > > > > > > > > 1.B) Implementation of CassandraResourceProvider > > > > > > > > > > > > > > 1.C) Implementation of CassandraResourceResolver > > > > > > > > > > > > > > 1.D) Implementation of CassandraResource > > > > > > > > > > > > > > > > > > > > > And I will start writing the CassanrdaResourceProviderUtil > class > > > > which > > > > > > > will do basic add and get using hector API. Please provide any > > > > feedback > > > > > > > that will be useful to accomplish this task. > > > > > > > So for this how does path mapping should be done. Because for > > > > example, > > > > > > the > > > > > > > path of the cassendra node will not be same as the jcr node > path. > > > i.e > > > > > > > provider will ask a node path /system/myapps/test/foo and where > > > > should > > > > > we > > > > > > > return it from Cassandra. Aren't we have to first consider the > > > WRITE > > > > > > aspect > > > > > > > to Cassandra ? > > > > > > > > > > > > > > > > > > > > > -- > > > > > > > Thanks > > > > > > > /Dishara > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > -- > > > > > > Thanks > > > > > > /Dishara > > > > > > > > > > > > > > > > > > > > > > > > > > > -- > > > > Thanks > > > > /Dishara > > > > > > > > > > > > > > > -- > > Thanks > > /Dishara > > > -- Thanks /Dishara