//add new object
CDefinition NewObjectDefinition = JsonUtil.objectFromJsonResource(CDefinition.class, this.getClass().getClassLoader(), "MigrationTestCDefinition.js");
NewKeyspaceDefinition.getDefinitions().put(NewObjectDefinition.getName(),NewObjectDefinition);
//Build the connection manager
ConnectionManager cm = getConnectionManager();
//This test requires that the keyspace be dropped before running
cm.dropKeyspace(OldKeyspaceDefinition.getName());
cm.dropKeyspace(cm.getRhombusKeyspaceName());
//Rebuild the keyspace and get the object mapper
cm.buildKeyspace(OldKeyspaceDefinition, true);
ObjectMapper om = cm.getObjectMapper(OldKeyspaceDefinition.getName());
//insert some data
//Get a test object to insert
Map<String, Object> testObject = JsonUtil.rhombusMapFromJsonMap(TestHelpers.getTestObject(0), OldKeyspaceDefinition.getDefinitions().get("testtype"));
UUID key = (UUID)om.insert("testtype", testObject);
//Query to get back the object from the database
Map<String, Object> dbObject = om.getByKey("testtype", key);
for(String dbKey : dbObject.keySet()) {
//Verify that everything but the key is the same
if(!dbKey.equals("id")) {
assertEquals(testObject.get(dbKey), dbObject.get(dbKey));
}
}
//run the migration grabbing a brand new object mapper
cm = getConnectionManager();
om = cm.getObjectMapper(NewKeyspaceDefinition);
//make sure that our keyspace definitions do not match
assertNotEquals(NewKeyspaceDefinition, cm.hydrateLatestKeyspaceDefinitionFromCassandra(NewKeyspaceDefinition.getName()));
assertNotEquals(NewKeyspaceDefinition, om.getKeyspaceDefinition_ONLY_FOR_TESTING());
//run the migration
cm.runMigration(NewKeyspaceDefinition, true);
//make sure that the object mapper has the new keyspace definition
CKeyspaceDefinition updatedKeyspaceDefinition = om.getKeyspaceDefinition_ONLY_FOR_TESTING();
assertEquals(NewKeyspaceDefinition, updatedKeyspaceDefinition);
//make sure that the new keyspace definition has been stored in the rhombus metadata store
CKeyspaceDefinition updatedRhombusDefinition = cm.hydrateLatestKeyspaceDefinitionFromCassandra(NewKeyspaceDefinition.getName());
assertEquals(NewKeyspaceDefinition, updatedRhombusDefinition);
//now query out some data grabbing a brand new object mapper
cm = getConnectionManager();
om = cm.getObjectMapper(NewKeyspaceDefinition.getName());
//now insert some stuff into the newly added object and indexes
testObject = JsonUtil.rhombusMapFromJsonMap(TestHelpers.getTestObject(0), OldKeyspaceDefinition.getDefinitions().get("testtype"));
om.insert("testtype", testObject);
testObject = Maps.newHashMap();
testObject.put("index_1", "one");
testObject.put("index_2", "two");
testObject.put("value", "three");
key = (UUID)om.insert("simple", testObject);
//Query to get back the object from the database
//Query by foreign key
Criteria criteria = new Criteria();
SortedMap<String, Object> indexValues = Maps.newTreeMap();
indexValues.put("data1", "This is data one");
indexValues.put("data2", "This is data two");
criteria.setIndexKeys(indexValues);
List<Map<String, Object>> results = om.list("testtype", criteria);
assertEquals(777L,results.get(0).get("foreignid"));
assertEquals("This is data one",results.get(0).get("data1"));
Map<String,Object> result = om.getByKey("simple", key);
assertEquals("one",result.get("index_1"));
assertEquals("two",result.get("index_2"));
assertEquals("three",result.get("value"));
// Make sure we have saved both versions of the keyspace
Session session = cm.getEmptySession();
StringBuilder sb = new StringBuilder();
sb.append("SELECT id from \"");
sb.append(cm.getRhombusKeyspaceName());
sb.append("\".\"__keyspace_definitions\" where name='");
sb.append(NewKeyspaceDefinition.getName());
sb.append("';");
ResultSet resultSet = session.execute(sb.toString());
Iterator<Row> rsIter = resultSet.iterator();
int counter = 0;
while(rsIter.hasNext()) {
counter++;
rsIter.next();
}
assertEquals(2, counter);
cm.teardown();
}