Hi Tupshin, Thanks for your help! Unfortunately in my case, I will need to do a compare and set in which the compare is against a value in a dynamic column.
In general, I need to be able to do the following: - Check whether a given value exists in a dynamic column - If so, perform some number of insertions / deletions for dynamic columns in the same row (i.e., with the same partition key as the dynamic column used for the compare) I think you are correct that I need https://issues.apache.org/jira/browse/CASSANDRA-5633 to be implemented. Is there any way to vote for that to get picked up again? :) Best regards, Clint On Mon, Feb 24, 2014 at 2:32 PM, Tupshin Harper <tups...@tupshin.com> wrote: > Hi Clint, > > That does appear to be an omission in CQL3. It would be possible to > simulate it by doing > BEGIN BATCH > UPDATE foo SET z = 10 WHERE x = 'a' AND y = 1 IF t= 2 AND z=10; > UPDATE foo SET t = 5,z=6 where x = 'a' AND y = 4 > APPLY BATCH; > > However, this does a redundant write to the first row if the condition > holds, and I certainly wouldn't recommend doing that routinely. > > Alternatively, depending on your needs, you might be able to use a static > column (coming with 2.0.6) as your conditional flag, as that column is > shared by all rows in the partition. > > -Tupshin > > > > On Mon, Feb 24, 2014 at 3:57 PM, Clint Kelly <clint.ke...@gmail.com>wrote: > >> Hi Tupshin, >> >> Thanks for your help; I appreciate it. >> >> Could I do something like the following? >> >> Given the same table you started with: >> >> x | y | t | z >> ---+---+---+---- >> a | 1 | 2 | 10 >> a | 2 | 2 | 20 >> >> I'd like to write a compare-and-set that does something like: >> >> "If there is a row with (x,y,t,z) = (a,1,2,10), then update/insert a >> row with (x,y,t,z) = (a,3,4,5) and update/insert a row with (x,y,t,z) >> = (a,4,5,6)." >> >> >> I don't see how I could do this with what you outlined above---just >> curious. It seems like what I describe above under the hood would be >> a compare-and-(batch)-set on a single wide row, so it maybe is >> possible with the Thrift API (I have to check). >> >> Thanks again! >> >> Best regards, >> Clint >> >> On Sat, Feb 22, 2014 at 11:38 AM, Tupshin Harper <tups...@tupshin.com> >> wrote: >> > #5633 was actually closed because the static columns feature >> > (https://issues.apache.org/jira/browse/CASSANDRA-6561) which has been >> > checked in to the 2.0 branch but is not yet part of a release (it will >> be in >> > 2.0.6). >> > >> > That feature will let you update multiple rows within a single >> partition by >> > doing a CAS write based on a static column shared by all rows within the >> > partition. >> > >> > Example extracted from the ticket: >> > CREATE TABLE foo ( >> > x text, >> > y bigint, >> > t bigint static, >> > z bigint, >> > PRIMARY KEY (x, y) ); >> > >> > insert into foo (x,y,t, z) values ('a', 1, 1, 10); >> > insert into foo (x,y,t, z) values ('a', 2, 2, 20); >> > >> > select * from foo; >> > >> > x | y | t | z >> > ---+---+---+---- >> > a | 1 | 2 | 10 >> > a | 2 | 2 | 20 >> > (Note that both values of "t" are 2 because it is static) >> > >> > >> > begin batch update foo set z = 1 where x = 'a' and y = 1; update foo >> set z >> > = 2 where x = 'a' and y = 2 if t = 4; apply batch; >> > >> > [applied] | x | y | t >> > -----------+---+------+--- >> > False | a | null | 2 >> > >> > (Both updates failed to apply because there was an unmet conditional on >> one >> > of them) >> > >> > select * from foo; >> > >> > x | y | t | z >> > ---+---+---+---- >> > a | 1 | 2 | 10 >> > a | 2 | 2 | 20 >> > >> > >> > begin batch update foo set z = 1 where x = 'a' and y = 1; update foo >> set z = >> > 2 where x = 'a' and y = 2 if t = 2; apply batch; >> > >> > [applied] >> > ----------- >> > True >> > >> > (both updates succeeded because the check on t succeeded) >> > >> > select * from foo; >> > x | y | t | z >> > ---+---+---+--- >> > a | 1 | 2 | 1 >> > a | 2 | 2 | 2 >> > >> > Hope this helps. >> > >> > -Tupshin >> > >> > >> > >> > On Fri, Feb 21, 2014 at 6:05 PM, DuyHai Doan <doanduy...@gmail.com> >> wrote: >> >> >> >> Hello Clint >> >> >> >> The Resolution status of the JIRA is set to "Later", probably the >> >> implementation is not done yet. The JIRA was opened to discuss about >> impl >> >> strategy but nothing has been coded so far I guess. >> >> >> >> >> >> >> >> On Sat, Feb 22, 2014 at 12:02 AM, Clint Kelly <clint.ke...@gmail.com> >> >> wrote: >> >>> >> >>> Folks, >> >>> >> >>> Does anyone know how I can modify multiple rows at once in a >> >>> lightweight transaction in CQL3? >> >>> >> >>> I saw the following ticket: >> >>> >> >>> https://issues.apache.org/jira/browse/CASSANDRA-5633 >> >>> >> >>> but it was not obvious to me from the comments how (or whether) this >> >>> got resolved. I also couldn't find anything in the DataStax >> >>> documentation about how to perform these operations. >> >>> >> >>> I'm in particular interested in how to perform a compare-and-set >> >>> operation that modifies multiple rows (with the same partition key) >> >>> using the DataStax Java driver. >> >>> >> >>> Thanks! >> >>> >> >>> Best regards, >> >>> Clint >> >> >> >> >> > >> > >