All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.netflix.ndbench.plugin.cass.CassUDTFrozen Maven / Gradle / Ivy

/**
 * Copyright (c) 2017 Netflix, Inc.  All rights reserved.
 */
package com.netflix.ndbench.plugin.cass;

import com.datastax.driver.core.*;
import com.datastax.driver.core.querybuilder.QueryBuilder;
import com.datastax.driver.mapping.MappingManager;
import com.google.inject.Inject;
import com.netflix.archaius.api.PropertyFactory;
import com.netflix.ndbench.api.plugin.annotations.NdBenchClientPlugin;
import com.netflix.ndbench.api.plugin.common.NdBenchConstants;
import org.apache.commons.lang.RandomStringUtils;

import java.time.Instant;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;

/**
 * @author vchella
 */
@NdBenchClientPlugin("CassUDTFrozen")
@SuppressWarnings("unused")
public class CassUDTFrozen extends CJavaDriverBasePlugin {

    //Settings
    private static String ADDRESS_TYPE;
    private static String FULLNAME_TYPE;
    private static String EMAIL_TYPE;

    private static Boolean randomReads;
    private static Boolean randomWrites;

    private PreparedStatement readPstmt1;
    private PreparedStatement readPstmt2;
    private PreparedStatement readPstmt3;

    private PreparedStatement insertPstmt1;

    private PreparedStatement updatePstmt1;

    private PreparedStatement casPstmt1;
    private PreparedStatement casPstmt2;
    private PreparedStatement updatePstmt2;

    private UserType fullnameType, emailType, addressType;

    @Override
    void preInit() {
        ADDRESS_TYPE  = propertyFactory.getProperty(NdBenchConstants.PROP_NAMESPACE+"cass.udt.address_type").asString("address_type").get();
        FULLNAME_TYPE  = propertyFactory.getProperty(NdBenchConstants.PROP_NAMESPACE+"cass.udt.fullname_type").asString("fullname_type").get();
        EMAIL_TYPE  = propertyFactory.getProperty(NdBenchConstants.PROP_NAMESPACE+"cass.udt.email_type").asString("email_type").get();


        randomReads = propertyFactory.getProperty(NdBenchConstants.PROP_NAMESPACE+"cass.udt.randomReads").asBoolean(true).get();

        randomWrites = propertyFactory.getProperty(NdBenchConstants.PROP_NAMESPACE+"cass.udt.randomWrites").asBoolean(true).get();

    }
    @Inject
    public CassUDTFrozen(PropertyFactory propertyFactory, CassJavaDriverManager javaDriverManager) {
        super(propertyFactory, javaDriverManager);
    }


    @Override
    void upsertKeyspace(Session session) {
        session.execute("CREATE KEYSPACE IF NOT EXISTS " +KeyspaceName+" WITH replication = {'class': 'NetworkTopologyStrategy','eu-west': '3','us-east': '3'};");
        session.execute("Use " + KeyspaceName);

    }

    @Override
    void upsertCF(Session session) {


        session.execute("CREATE TYPE  IF NOT EXISTS  "+ADDRESS_TYPE+" (street text, city text, zip_code int, phones set)");

        session.execute("CREATE TYPE  IF NOT EXISTS  "+FULLNAME_TYPE+" (firstname text, lastname text)");

        session.execute("CREATE TYPE IF NOT EXISTS  "+EMAIL_TYPE+" (fp text, domain text)");

        session.execute("CREATE TABLE IF NOT EXISTS  "+TableName+" ( id text PRIMARY KEY, name frozen , emails set>, billing_addresses map>, account_type text)");
    }


    @Override
    void prepStatements(Session session) {
        readPstmt1 = session.prepare(" SELECT * FROM "+TableName+" WHERE id = ?" );
        readPstmt2 = session.prepare(" SELECT name.lastname FROM "+TableName+" WHERE id = ?" );
        readPstmt3 = session.prepare(" SELECT emails, billing_addresses FROM "+TableName+" WHERE id = ?" );

        insertPstmt1 = session.prepare("INSERT INTO "+TableName+" (id, name, account_type) VALUES  (?, ?, ?)");


        updatePstmt1 = session.prepare("UPDATE "+TableName+" SET billing_addresses = billing_addresses + ? " +
                ", emails = emails + ? WHERE id = ?");


        casPstmt1 = session.prepare("UPDATE "+TableName+" SET billing_addresses = billing_addresses + ? WHERE id = ?                   if account_type='Paid'");

        casPstmt2 = session.prepare("UPDATE "+TableName+" SET emails = emails - ? WHERE id = ? if exists");

        updatePstmt2 = session.prepare("UPDATE "+TableName+" SET billing_addresses = billing_addresses - ? WHERE id = ?");

    }
    @Override
    void postInit() {
        addressType = session.getCluster().
                getMetadata().getKeyspace(KeyspaceName).getUserType("address_type");
        fullnameType = session.getCluster().
                getMetadata().getKeyspace(KeyspaceName).getUserType("fullname_type");
        emailType = session.getCluster().
                getMetadata().getKeyspace(KeyspaceName).getUserType("email_type");

    }



    @Override
    public String readSingle(String key) throws Exception {

        int option = -1;
        if(randomReads) {
            option = this.dataGenerator.getRandomInteger() % 3;
        }

        switch (option)
        {
            case 0:
                return readAllByKey(key);
            case 1:
                return readUDTByKey(key);
            case 2:
                return readCollectionsByKey(key);
            default:
                 if (readAllByKey(key) != CacheMiss && readUDTByKey(key) != CacheMiss && readCollectionsByKey(key) != CacheMiss)
                    return ResultOK;
                 return CacheMiss;
        }


    }

    private String readAllByKey(String key)
    {
        BoundStatement statement = readPstmt1.bind();
        statement.setString("id", key);
        statement.setConsistencyLevel(this.ReadConsistencyLevel);
        ResultSet rs = session.execute(statement);

        List result = rs.all();

        if (result.isEmpty()) {
            return CacheMiss;
        }

        return ResultOK;
    }

    private String readUDTByKey(String key)
    {
        BoundStatement statement = readPstmt2.bind();
        statement.setString("id", key);
        statement.setConsistencyLevel(this.ReadConsistencyLevel);
        ResultSet rs = session.execute(statement);

        List result = rs.all();

        if (result.isEmpty()) {
            return CacheMiss;
        }

        return ResultOK;
    }

    private String readCollectionsByKey(String key)
    {
        BoundStatement statement = readPstmt3.bind();
        statement.setString("id", key);
        statement.setConsistencyLevel(this.ReadConsistencyLevel);
        ResultSet rs = session.execute(statement);

        List result = rs.all();

        if (result.isEmpty()) {
            return CacheMiss;
        }

        return ResultOK;
    }

    @Override
    public String writeSingle(String key) throws Exception {

        int option = -1;
        if(randomWrites) {
            option = this.dataGenerator.getRandomInteger() % 3;
        }
        switch (option)
        {
            case 0:
                return insertSimple(key);
            case 1:
                return updateSimple(key);
            case 2:
                return updateCasSimple(key);
            default:
                if (insertSimple(key) != CacheMiss && updateSimple(key) != CacheMiss && updateCasSimple(key) != CacheMiss)
                    return ResultOK;
                return CacheMiss;
        }




    }

    private String insertSimple(String key) {

        UDTValue name = fullnameType.newValue();
        name.setString("firstname", this.dataGenerator.getRandomValue());
        name.setString("lastname", this.dataGenerator.getRandomValue());

        BoundStatement bStmt = insertPstmt1.bind(key,name,this.dataGenerator.getRandomInteger()%2==0?"Paid":"Free");

        bStmt.setConsistencyLevel(this.WriteConsistencyLevel);

        ResultSet rs = session.execute(bStmt);

        if (rs !=null)
            return ResultOK;

        return ResutlFailed;
    }

    private String updateSimple(String key) {

        Map billing_addresses = new HashMap<>();

        HashSet phones = new HashSet<>();
        for (int i = 0; i < this.dataGenerator.getRandomInteger()%6+1; i++) {
            phones.add(RandomStringUtils.randomAlphanumeric(10));
        }


        UDTValue address = addressType.newValue();
        address.setString("street", RandomStringUtils.randomAlphanumeric(30));
        address.setString("city", RandomStringUtils.randomAlphanumeric(20));
        address.setInt("zip_code", this.dataGenerator.getRandomInteger());
        address.setSet("phones", phones);

        billing_addresses.put(RandomStringUtils.randomAlphanumeric(8),address);


        HashSet emails = new HashSet<>();
        for (int i = 0; i < this.dataGenerator.getRandomInteger()%5+1; i++) {
            UDTValue email = emailType.newValue();
            email.setString("fp",RandomStringUtils.randomAlphanumeric(15));
            email.setString("domain",RandomStringUtils.randomAlphanumeric(10));
            emails.add(email);
        }



        BoundStatement bStmt = updatePstmt1.bind();

        bStmt.setMap("billing_addresses", billing_addresses);
        bStmt.setSet("emails", emails);
        bStmt.setString("id", key);

        bStmt.setConsistencyLevel(this.WriteConsistencyLevel);

        ResultSet rs = session.execute(bStmt);

        if (rs !=null)
            return ResultOK;

        return ResutlFailed;
    }


    private String updateCasSimple(String key) {

        BatchStatement batch = new BatchStatement();

        //Simple CAS stmt with billing_addresses '+' operation
        Map billing_addresses = new HashMap<>();

        HashSet phones = new HashSet<>();
        for (int i = 0; i < this.dataGenerator.getRandomInteger()%6+1; i++) {
            phones.add(RandomStringUtils.randomAlphanumeric(10));
        }


        UDTValue address = addressType.newValue();
        address.setString("street", RandomStringUtils.randomAlphanumeric(30));
        address.setString("city", RandomStringUtils.randomAlphanumeric(20));
        address.setInt("zip_code", this.dataGenerator.getRandomInteger());
        address.setSet("phones", phones);

        billing_addresses.put(RandomStringUtils.randomAlphanumeric(8),address);

        BoundStatement bStmt1 = casPstmt1.bind();

        bStmt1.setMap("billing_addresses", billing_addresses);
        bStmt1.setString("id", key);
        bStmt1.setConsistencyLevel(this.WriteConsistencyLevel);

        batch.add(bStmt1);


        //Simple CAS stmt with email '-' operation
        HashSet emails = new HashSet<>();
        for (int i = 0; i < this.dataGenerator.getRandomInteger()%2+1; i++) {
            UDTValue email = emailType.newValue();
            email.setString("fp",RandomStringUtils.randomAlphanumeric(15));
            email.setString("domain",RandomStringUtils.randomAlphanumeric(10));
            emails.add(email);
        }


        BoundStatement bStmt2 = casPstmt2.bind();

        bStmt2.setSet("emails", emails);
        bStmt2.setString("id", key);
        bStmt2.setConsistencyLevel(this.WriteConsistencyLevel);

        batch.add(bStmt2);



        // Simple Update Stmt with `-` operation
//
//        Map billing_addresses2 = new HashMap<>();
//
//        HashSet phones2 = new HashSet<>();
//        for (int i = 0; i < this.dataGenerator.getRandomInteger()%6; i++) {
//            phones2.add(RandomStringUtils.randomAlphanumeric(10));
//        }
//
//
//        UDTValue address2 = addressType.newValue();
//        address2.setString("street", RandomStringUtils.randomAlphanumeric(30));
//        address2.setString("city", RandomStringUtils.randomAlphanumeric(20));
//        address2.setInt("zip_code", this.dataGenerator.getRandomInteger());
//        address2.setSet("phones", phones2);
//
//        billing_addresses2.put(RandomStringUtils.randomAlphanumeric(8),address);
//
//        BoundStatement bStmt3 = updatePstmt2.bind();
//
//        bStmt3.setMap("billing_addresses", billing_addresses2);
//
//        bStmt3.setString("id", key);
//
//        bStmt3.setConsistencyLevel(this.WriteConsistencyLevel);
//
//        batch.add(bStmt3);




        ResultSet rs =  session.execute(batch);

        batch.clear();

        if (rs !=null)
            return ResultOK;

        return ResutlFailed;
    }
	@Override
	public List readBulk(List keys) throws Exception {
        throw new UnsupportedOperationException("bulk operation is not supported");
	}
	@Override
	public List writeBulk(List keys) throws Exception {
        throw new UnsupportedOperationException("bulk operation is not supported");
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy