package io.teknek.nibiru.trigger; import java.util.List; import java.util.SortedMap; import io.teknek.nibiru.Server; import io.teknek.nibiru.ServerShutdown; import io.teknek.nibiru.TestUtil; import io.teknek.nibiru.TriggerDefinition; import io.teknek.nibiru.TriggerLevel; import io.teknek.nibiru.Val; import io.teknek.nibiru.client.Client; import io.teknek.nibiru.client.ClientException; import io.teknek.nibiru.client.ColumnFamilyClient; import io.teknek.nibiru.client.MetaDataClient; import io.teknek.nibiru.client.Session; import io.teknek.nibiru.engine.DefaultColumnFamily; import io.teknek.nibiru.metadata.StoreMetaData; import io.teknek.nibiru.transport.BaseMessage; import io.teknek.nibiru.transport.Response; import io.teknek.nibiru.transport.columnfamily.PutMessage; import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; public class TriggerTest extends ServerShutdown { private static final String PET_AGE_CF = "petage"; @Rule public TemporaryFolder node1Folder = new TemporaryFolder(); private Server server; private ColumnFamilyClient client; private MetaDataClient meta; @Before public void buildServer(){ server = registerServer(TestUtil.aBasicServer(node1Folder)); client = new ColumnFamilyClient( new Client(server.getConfiguration().getTransportHost(), server.getConfiguration().getTransportPort(), 10000, 10000)); meta = new MetaDataClient(server.getConfiguration().getTransportHost(), server.getConfiguration().getTransportPort(), 10000, 10000); } @After public void closeServer(){ client.shutdown(); meta.shutdown(); } @Test public void helloTrigger() throws ClientException{ List<TriggerDefinition> defs = server.getKeyspaces().get(TestUtil.DATA_KEYSPACE).getStores() .get(TestUtil.PETS_COLUMN_FAMILY).getStoreMetadata().getCoordinatorTriggers(); TriggerDefinition td = new TriggerDefinition(); td.setTriggerClass(PrintlnCoordinatorTrigger.class.getName()); td.setTriggerLevel(TriggerLevel.BLOCKING); defs.add(td); Session s = client.createBuilder().withKeyspace(TestUtil.DATA_KEYSPACE).withStore(TestUtil.PETS_COLUMN_FAMILY).build(); s.put("a", "b", "c", 1L); } @Test public void reverseIndexTrigger() throws ClientException{ meta.createOrUpdateStore( TestUtil.DATA_KEYSPACE, PET_AGE_CF, new Response().withProperty(StoreMetaData.IMPLEMENTING_CLASS, DefaultColumnFamily.class.getName()), true); //We need a way to do this from the metaclient TriggerDefinition td = new TriggerDefinition(); td.setTriggerClass(PetAgeReverseTrigger.class.getName()); td.setTriggerLevel(TriggerLevel.BLOCKING); List<TriggerDefinition> defs = server.getKeyspaces().get(TestUtil.DATA_KEYSPACE).getStores() .get(TestUtil.PETS_COLUMN_FAMILY).getStoreMetadata().getCoordinatorTriggers(); defs.add(td); Session s = client.createBuilder().withKeyspace(TestUtil.DATA_KEYSPACE).withStore(TestUtil.PETS_COLUMN_FAMILY).build(); s.put("rover", "age", "5", 1L); s.put("sandy", "age", "3", 1L); s.put("spot", "age", "5", 1L); Session s1 = client.createBuilder().withKeyspace(TestUtil.DATA_KEYSPACE).withStore(PET_AGE_CF).build(); SortedMap<String,Val> res = s1.slice("5", "a", "zzzzzzzzzzzzzzzzz"); Assert.assertEquals(2, res.size()); Assert.assertEquals("rover", res.firstKey()); Assert.assertEquals("spot", res.lastKey()); } public static class PetAgeReverseTrigger implements CoordinatorTrigger { @Override public void exec(BaseMessage message, Response response, Server server) { if (!(message instanceof PutMessage)) return; PutMessage p = (PutMessage) message; if ("age".equalsIgnoreCase(p.getColumn())){ PutMessage m = new PutMessage(); m.setKeyspace("data"); m.setStore(PET_AGE_CF); m.setRow(p.getValue()); m.setColumn(p.getRow()); m.setValue(""); m.setVersion(System.currentTimeMillis()); server.getCoordinator().handle(m); } } } }