/*******************************************************************************
* /*
* *
* * Copyright 2013 Netflix, Inc.
* *
* * Licensed under the Apache License, Version 2.0 (the "License");
* * you may not use this file except in compliance with the License.
* * You may obtain a copy of the License at
* *
* * http://www.apache.org/licenses/LICENSE-2.0
* *
* * Unless required by applicable law or agreed to in writing, software
* * distributed under the License is distributed on an "AS IS" BASIS,
* * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* * See the License for the specific language governing permissions and
* * limitations under the License.
* *
* *
******************************************************************************/
package com.netflix.staash.rest.dao;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import com.datastax.driver.core.Cluster;
import com.datastax.driver.core.ResultSet;
import com.datastax.driver.core.Row;
import com.datastax.driver.core.Session;
import com.datastax.driver.core.exceptions.AlreadyExistsException;
import com.datastax.driver.core.exceptions.DriverException;
import com.netflix.staash.json.JsonArray;
import com.netflix.staash.json.JsonObject;
import com.netflix.staash.rest.meta.entity.Entity;
import com.netflix.staash.rest.meta.entity.EntityType;
import com.netflix.staash.rest.util.MetaConstants;
import com.netflix.staash.rest.util.PaasUtils;
public class CqlMetaDaoImplNew implements MetaDao {
private Cluster cluster;
private Session session;
// List<String> dbHolder = new ArrayList<String>();
// Map<String, String> tableToStorageMap = new ConcurrentHashMap<String, String>();
// Map<String,JsonObject> storageMap = new ConcurrentHashMap<String,JsonObject>();
// Map<String, List<String>> dbToTableMap = new ConcurrentHashMap<String, List<String>>();
// Map<String, List<String>> dbToTimeseriesMap = new ConcurrentHashMap<String, List<String>>();
private boolean schemaCreated = false;
public CqlMetaDaoImplNew(Cluster cluster) {
this.cluster = cluster;
this.session = this.cluster.connect();
// LoadStorage();
// LoadDbNames();
// LoadDbToTableMap();
// LoadDbToTimeSeriesMap();
// LoadTableToStorage();
// TODO Auto-generated constructor stub
}
private void maybeCreateMetaSchema() {
try {
if (schemaCreated)
return;
try {
session.execute(String.format(
PaasUtils.CREATE_KEYSPACE_SIMPLE_FORMAT, MetaConstants.META_KEY_SPACE, 1));
} catch (AlreadyExistsException e) {
// It's ok, ignore
}
session.execute("USE " + MetaConstants.META_KEY_SPACE);
for (String tableDef : getTableDefinitions()) {
try {
session.execute(tableDef);
} catch (AlreadyExistsException e) {
// It's ok, ignore
}
}
schemaCreated = true;
} catch (DriverException e) {
throw e;
}
}
protected Collection<String> getTableDefinitions() {
String metaDynamic = "CREATE TABLE metacf (\n" + " key text,\n"
+ " column1 text,\n" + " value text,\n"
+ " PRIMARY KEY (key, column1)\n"
+ ") WITH COMPACT STORAGE;";
List<String> allDefs = new ArrayList<String>();
allDefs.add(metaDynamic);
return allDefs;
}
public String writeMetaEntity(Entity entity) {
session.execute(String.format(PaasUtils.INSERT_FORMAT, MetaConstants.META_KEY_SPACE + "."
+ MetaConstants.META_COLUMN_FAMILY, entity.getRowKey(), entity.getName(),
entity.getPayLoad()));
//addEntityToCache(entity.getRowKey(), entity);
return "{\"msg\":\"ok\"";
}
// public String listStorage() {
// Set<String> allStorage = storageMap.keySet();
// JsonObject obj = new JsonObject();
// JsonArray arr = new JsonArray();
// for (String storage: allStorage) {
// arr.addString(storage);
// }
// obj.putArray("storages", arr);
// return obj.toString();
// }
// public String listSchemas(){
// JsonObject obj = new JsonObject();
// JsonArray arr = new JsonArray();
// for (String db: dbHolder) {
// arr.addString(db);
// }
// obj.putArray("schemas", arr);
// return obj.toString();
// }
// public String listTablesInSchema(String db) {
// List<String> tables = dbToTableMap.get(db);
// JsonObject obj = new JsonObject();
// JsonArray arr = new JsonArray();
// for (String table: tables) {
// arr.addString(table);
// }
// obj.putArray(db, arr);
// return obj.toString();
// }
// public String listTimeseriesInSchema(String db) {
// List<String> tables = dbToTimeseriesMap.get(db);
// JsonObject obj = new JsonObject();
// JsonArray arr = new JsonArray();
// for (String table: tables) {
// arr.addString(table);
// }
// obj.putArray(db, arr);
// return obj.toString();
// }
// private void addEntityToCache(String rowkey, Entity entity) {
// switch (EntityType.valueOf(rowkey)) {
// case STORAGE:
// storageMap.put(entity.getName(), new JsonObject(entity.getPayLoad()));
// break;
// case DB:
// dbHolder.add(entity.getName());
// break;
// case TABLE:
// JsonObject payobject = new JsonObject(entity.getPayLoad());
// tableToStorageMap.put(entity.getName(), payobject.getString("storage"));
// String db = payobject.getString("db");
// List<String> tables = dbToTableMap.get(db);
// if (tables == null || tables.size() == 0) {
// tables = new ArrayList<String>();
// tables.add(entity.getName());
// } else {
// tables.add(entity.getName());
// }
// dbToTableMap.put(db, tables);
// break;
//
// case SERIES:
// JsonObject tsobject = new JsonObject(entity.getPayLoad());
// tableToStorageMap.put(entity.getName(), tsobject.getString("storage"));
// String dbname = tsobject.getString("db");
// List<String> alltables = dbToTableMap.get(dbname);
// if (alltables == null || alltables.size() == 0) {
// alltables = new ArrayList<String>();
// alltables.add(entity.getName());
// } else {
// alltables.add(entity.getName());
// }
// dbToTimeseriesMap.put(dbname, alltables);
// break;
// }
// }
// private void LoadTableToStorage() {
// ResultSet rs = session
// .execute("select column1, value from paasmetaks.metacf where key='"+MetaConstants.PAAS_TABLE_ENTITY_TYPE+"';");
// List<Row> rows = rs.all();
// for (Row row : rows) {
// String field = row.getString(0);
// JsonObject val = new JsonObject(row.getString(1));
// String storage = val.getField("storage");
// tableToStorageMap.put(field, storage);
// }
// }
// public Map<String,JsonObject> LoadStorage() {
// ResultSet rs = session
// .execute("select column1, value from paasmetaks.metacf where key='"+MetaConstants.PAAS_STORAGE_TYPE_ENTITY+"';");
// List<Row> rows = rs.all();
// for (Row row : rows) {
// String field = row.getString(0);
// JsonObject val = new JsonObject(row.getString(1));
// storageMap.put(field, val);
// }
// return storageMap;
// }
//
// private void LoadDbNames() {
// ResultSet rs = session
// .execute("select column1 from paasmetaks.metacf where key='com.test.entity.type.paas.db';");
// List<Row> rows = rs.all();
// for (Row row : rows) {
// dbHolder.add(row.getString(0));
// }
// }
// private void LoadDbToTableMap() {
// ResultSet rs = session
// .execute("select column1 from paasmetaks.metacf where key='com.test.entity.type.paas.table';");
// List<Row> rows = rs.all();
// for (Row row : rows) {
// String key = row.getString(0).split("\\.")[0];
// String table = row.getString(0).split("\\.")[1];
// List<String> currval = null;
// currval = dbToTableMap.get(key);
// if (currval == null) {
// currval = new ArrayList<String>();
// }
// currval.add(table);
// dbToTableMap.put(key, currval);
// }
// }
// private void LoadDbToTimeSeriesMap() {
// ResultSet rs = session
// .execute("select column1 from paasmetaks.metacf where key='com.test.entity.type.paas.timeseries';");
// List<Row> rows = rs.all();
// for (Row row : rows) {
// String key = row.getString(0).split("\\.")[0];
// String table = row.getString(0).split("\\.")[1];
// List<String> currval = null;
// currval = dbToTimeseriesMap.get(key);
// if (currval == null) {
// currval = new ArrayList<String>();
// }
// currval.add(table);
// dbToTimeseriesMap.put(key, currval);
// }
// }
// public Entity readMetaEntity(String rowKey) {
// // TODO Auto-generated method stub
// return null;
// }
//
// public String writeRow(String db, String table, JsonObject rowObj) {
// // TODO Auto-generated method stub
// return null;
// }
//
// public String listRow(String db, String table, String keycol, String key) {
// // TODO Auto-generated method stub
// return null;
// }
//
public Map<String, String> getStorageMap() {
// TODO Auto-generated method stub
return null;
}
public Map<String, JsonObject> runQuery(String key, String col) {
// TODO Auto-generated method stub
ResultSet rs;
if (col!=null && !col.equals("*")) {
rs = session
.execute("select column1, value from "+MetaConstants.META_KEY_SPACE+"."+MetaConstants.META_COLUMN_FAMILY+ " where key='"+key+"' and column1='"+col+"';");
}
else {
rs = session
.execute("select column1, value from "+MetaConstants.META_KEY_SPACE+"."+MetaConstants.META_COLUMN_FAMILY+ " where key='"+key+"';");
}
List<Row> rows = rs.all();
Map<String,JsonObject> storageMap = new HashMap<String,JsonObject>();
for (Row row : rows) {
String field = row.getString(0);
JsonObject val = new JsonObject(row.getString(1));
storageMap.put(field, val);
}
return storageMap;
}
}