Package com.netflix.staash.rest.dao

Source Code of com.netflix.staash.rest.dao.CqlDataDaoImpl

/*******************************************************************************
* /*
*  *
*  *  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 static com.datastax.driver.core.querybuilder.QueryBuilder.eq;
import static com.datastax.driver.core.querybuilder.QueryBuilder.select;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.List;
import com.datastax.driver.core.Cluster;
import com.datastax.driver.core.ColumnDefinitions;
import com.datastax.driver.core.ResultSet;
import com.datastax.driver.core.Row;
import com.datastax.driver.core.Session;
import com.google.inject.Inject;
import com.google.inject.name.Named;
import com.netflix.staash.json.JsonObject;
import com.netflix.staash.rest.meta.entity.PaasTableEntity;
import com.netflix.staash.rest.util.Pair;
import com.netflix.staash.service.CacheService;
import com.netflix.staash.storage.service.MySqlService;

public class CqlDataDaoImpl implements DataDao {
    private MetaDao meta;
    private Cluster cluster;
    private Session session;
    @Inject
    public CqlDataDaoImpl(@Named("datacluster") Cluster cluster,  MetaDao meta) {
        this.cluster = cluster;
        this.meta = meta;
        this.session = this.cluster.connect();
        //from the meta get the name of the cluster for this db
    }
    public String writeRow(String db, String table, JsonObject rowObj) {
        String query = BuildRowInsertQuery(db, table, rowObj);
        Print(query);
        //String storage = rowObj.getField("storage");
        String storage = meta.runQuery("com.netflix.test.storage",db+"."+table).get(db+"."+table).getString("storage");
        if (storage!=null && storage.equals("mysql")) {
            MySqlService.insertRowIntoTable(db, table, query);
        } else {
        session.execute(query);
        }
        JsonObject obj = new JsonObject("{\"status\":\"ok\"}");
        return obj.toString();
    }

    private String BuildRowInsertQuery(String db, String table,
            JsonObject rowObj) {
        // TODO Auto-generated method stub
        String columns = rowObj.getString("columns");
        String values = rowObj.getString("values");
        //String storage = rowObj.getField("storage");
        String storage = meta.runQuery("com.netflix.test.storage",db+"."+table).get(db+"."+table).getString("storage");
        if (storage!=null && storage.contains("mysql")) return "INSERT INTO" + " " + table + "(" + columns + ")"
                + " VALUES(" + values + ");";else
        return "INSERT INTO" + " " + db + "." + table + "(" + columns + ")"
                + " VALUES(" + values + ");";
    }

    private void Print(String str) {
        // TODO Auto-generated method stub
        System.out.println(str);
    }

    private String BuildQuery(PaasTableEntity tableEnt) {
        // TODO Auto-generated method stub
        String schema = tableEnt.getSchemaName();
        String tableName = tableEnt.getName();
        List<Pair<String, String>> columns = tableEnt.getColumns();
        String colStrs = "";
        for (Pair<String, String> colPair : columns) {
            colStrs = colStrs + colPair.getRight() + " " + colPair.getLeft()
                    + ", ";
        }
        String primarykeys = tableEnt.getPrimarykey();
        String PRIMARYSTR = "PRIMARY KEY(" + primarykeys + ")";
        return "CREATE TABLE " + schema + "." + tableName + " (" + colStrs
                + " " + PRIMARYSTR + ");";
    }

    public String listRow(String db, String table, String keycol, String key) {
        // TODO Auto-generated method stub
        String storage = meta.runQuery("com.netflix.test.storage",db+"."+table).get(db+"."+table).getString("storage");
        if (storage!=null && storage.contains("mysql")) {
            String query = "select * from "+table+" where "+keycol+"=\'"+key+"\'";
            Print(query);
            java.sql.ResultSet rs = MySqlService.executeRead(db, query);
            try {
                while (rs.next()) {
                    ResultSetMetaData rsmd = rs.getMetaData();
                    String columns ="";
                    String values = "";
                    int count = rsmd.getColumnCount();
                    for (int i=1;i<=count;i++) {
                        String colName = rsmd.getColumnName(i);
                        columns = columns + colName + ",";
                        String value = rs.getString(i);
                        values = values + value +",";
                    }
                    JsonObject response = new JsonObject();
                    response.putString("columns", columns.substring(0, columns.length()-1));
                    response.putString("values", values.substring(0, values.length()-1));
                    return response.toString();
                }
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        String query = select().all().from(db, table).where(eq(keycol, key))
                .getQueryString();
        Cluster cluster = Cluster.builder().addContactPoints("localhost").build();
        Session session = cluster.connect(db);
        ResultSet rs = session.execute(query);
        return convertResultSet(rs);
    }

    private String convertResultSet(ResultSet rs) {
        // TODO Auto-generated method stub
        String colStr = "";
        String rowStr = "";
        JsonObject response = new JsonObject();
        List<Row> rows = rs.all();
        if (!rows.isEmpty() && rows.size() == 1) {
            rowStr = rows.get(0).toString();
        }
        ColumnDefinitions colDefs = rs.getColumnDefinitions();
        colStr = colDefs.toString();
        response.putString("columns", colStr.substring(8, colStr.length() - 1));
        response.putString("values", rowStr.substring(4, rowStr.length() - 1));
        return response.toString();
    }
    public String writeEvent(String db, String table, JsonObject rowObj) {
        // TODO Auto-generated method stub
        Long evTime = rowObj.getLong("time");
        String value = rowObj.getString("event");
        Long periodicity = 100L;
        Long rowKey = (evTime/periodicity)*periodicity;
        String INSERTSTR = "insert into "+db+"."+table+"(key,column1,value) values('"+rowKey.toString()+"',"+evTime+",'"+
        value+"');";
        Print(INSERTSTR);
        session.execute(INSERTSTR);
        JsonObject obj = new JsonObject("{\"status\":\"ok\"}");
        return obj.toString();
    }
    public String readEvent(String db, String table, String evTime) {
        // TODO Auto-generated method stub
        Long periodicity = 100L;
        Long rowKey = (Long.valueOf(evTime)/periodicity)*periodicity;
        String query = select().all().from(db, table).where(eq("key", String.valueOf(rowKey))).and(eq("column1",Long.valueOf(evTime)))
                .getQueryString();
        Cluster cluster = Cluster.builder().addContactPoints("localhost").build();
        Session session = cluster.connect(db);
        ResultSet rs = session.execute(query);
        return convertResultSet(rs);
    }
    public String doJoin(String db, String table1, String table2,
        String joincol, String value) {
        String res1 = listRow(db,table1,joincol,value);
        String res2 = listRow(db,table2,joincol,value);
        return "{\""+table1+"\":"+res1+",\""+table2+"\":"+res2+"}";
    }

}
TOP

Related Classes of com.netflix.staash.rest.dao.CqlDataDaoImpl

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.