Package com.impetus.client.cassandra.query

Source Code of com.impetus.client.cassandra.query.CassQueryTest

/*******************************************************************************
* * Copyright 2014 Impetus Infotech.
*  *
*  * 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.impetus.client.cassandra.query;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.metamodel.Metamodel;

import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.impetus.client.crud.PersonCassandra;
import com.impetus.client.crud.compositeType.CassandraCompoundKey;
import com.impetus.client.crud.compositeType.CassandraPrimeUser;
import com.impetus.kundera.client.Client;
import com.impetus.kundera.client.cassandra.persistence.CassandraCli;
import com.impetus.kundera.metadata.KunderaMetadataManager;
import com.impetus.kundera.metadata.model.EntityMetadata;
import com.impetus.kundera.metadata.model.MetamodelImpl;
import com.impetus.kundera.persistence.EntityManagerFactoryImpl;
import com.impetus.kundera.persistence.EntityManagerFactoryImpl.KunderaMetadata;
import com.impetus.kundera.persistence.EntityManagerImpl;
import com.impetus.kundera.persistence.PersistenceDelegator;
import com.impetus.kundera.query.KunderaQuery;
import com.impetus.kundera.query.KunderaQueryParser;

/**
* @author Kuldeep.Mishra
*
*/
public class CassQueryTest
{
    /** log for this class. */
    private static Logger log = LoggerFactory.getLogger(CassQueryTest.class);

    @Before
    public void setUp() throws Exception
    {
        CassandraCli.cassandraSetUp();
    }

    @After
    public void tearDown() throws Exception
    {

    }

    /**
     * Test method for
     * {@link com.impetus.client.cassandra.query.CassQuery#onQueryOverCQL3(com.impetus.kundera.metadata.model.EntityMetadata, com.impetus.kundera.client.Client, com.impetus.kundera.metadata.model.MetamodelImpl, java.util.List)}
     * .
     *
     * @throws InvocationTargetException
     * @throws IllegalAccessException
     * @throws IllegalArgumentException
     */
    @Test
    public void testOnQueryOverCQL3ForSimpleEntity() throws IllegalArgumentException, IllegalAccessException,
            InvocationTargetException
    {
        CassandraCli.createKeySpace("KunderaExamples");
        String pu = "secIdxCassandraTest";
        EntityManagerFactory emf = Persistence.createEntityManagerFactory(pu);
        EntityManager em = emf.createEntityManager();

        // Simple Query.
        String queryString = "Select p from PersonCassandra p WHERE p.personId = 'kk'";

        String cqlQuery = parseAndCreateCqlQuery(getQueryObject(queryString, emf), emf, em, pu, PersonCassandra.class,
                200);

        Assert.assertNotNull(cqlQuery);

        Assert.assertEquals("SELECT * FROM \"PERSONCASSANDRA\" WHERE token(\"personId\") = token('kk') LIMIT 200", cqlQuery);

        // In Query.
        queryString = "Select p from PersonCassandra p WHERE p.personId in ('kk', 'sk','pk')";

        cqlQuery = parseAndCreateCqlQuery(getQueryObject(queryString, emf), emf, em, pu, PersonCassandra.class, 400);

        Assert.assertNotNull(cqlQuery);

//        "SELECT * FROM "PERSONCASSANDRA" WHERE "personId" IN ('(''kk''', 'sk', '''pk') LIMIT 400";
        Assert.assertEquals("SELECT * FROM \"PERSONCASSANDRA\" WHERE \"personId\" IN ('kk', 'sk', 'pk') LIMIT 400", cqlQuery);

        // In Query set Paramater.
        queryString = "Select p from PersonCassandra p WHERE p.personId in :nameList";

        List<String> nameList = new ArrayList<String>();
        nameList.add("kk");
        nameList.add("dk");
        nameList.add("sk");

        KunderaQuery kunderaQuery = getQueryObject(queryString, emf);
        kunderaQuery.setParameter("nameList", nameList);

        cqlQuery = parseAndCreateCqlQuery(kunderaQuery, emf, em, pu, PersonCassandra.class, Integer.MAX_VALUE);

        Assert.assertNotNull(cqlQuery);

        Assert.assertEquals("SELECT * FROM \"PERSONCASSANDRA\" WHERE \"personId\" IN ('kk', 'dk', 'sk' ) ", cqlQuery);

        // In Query set Paramater with and clause.
        queryString = "Select p from PersonCassandra p WHERE p.personId in :nameList and p.age = 10";

        kunderaQuery = getQueryObject(queryString, emf);
        kunderaQuery.setParameter("nameList", nameList);

        cqlQuery = parseAndCreateCqlQuery(kunderaQuery, emf, em, pu, PersonCassandra.class, Integer.MAX_VALUE);

        Assert.assertNotNull(cqlQuery);

        Assert.assertEquals(
                "SELECT * FROM \"PERSONCASSANDRA\" WHERE \"personId\" IN ('kk', 'dk', 'sk' )  AND \"AGE\" = 10  ALLOW FILTERING",
                cqlQuery);

        // In Query set Paramater with gt clause.
        queryString = "Select p from PersonCassandra p WHERE p.personId in :nameList and p.age > 10";

        kunderaQuery = getQueryObject(queryString, emf);
        kunderaQuery.setParameter("nameList", nameList);

        cqlQuery = parseAndCreateCqlQuery(kunderaQuery, emf, em, pu, PersonCassandra.class, 5);

        Assert.assertNotNull(cqlQuery);

        Assert.assertEquals(
                "SELECT * FROM \"PERSONCASSANDRA\" WHERE \"personId\" IN ('kk', 'dk', 'sk' )  AND \"AGE\" > 10 LIMIT 5  ALLOW FILTERING",
                cqlQuery);

        // In Query over non pk field set Paramater with gt clause.
        queryString = "Select p from PersonCassandra p WHERE p.age in :ageList and p.personName = 'vivek'";

        List<Integer> ageList = new ArrayList<Integer>();
        ageList.add(10);
        ageList.add(20);
        ageList.add(30);

        kunderaQuery = getQueryObject(queryString, emf);
        kunderaQuery.setParameter("ageList", ageList);

        cqlQuery = parseAndCreateCqlQuery(kunderaQuery, emf, em, pu, PersonCassandra.class, 100);

        Assert.assertNotNull(cqlQuery);

        Assert.assertEquals(
                "SELECT * FROM \"PERSONCASSANDRA\" WHERE \"AGE\" IN (10, 20, 30 )  AND \"PERSON_NAME\" = 'vivek' LIMIT 100  ALLOW FILTERING",
                cqlQuery);

        em.close();
        emf.close();

        CassandraCli.dropKeySpace("KunderaExamples");
    }

    /**
     * Test method for
     * {@link com.impetus.client.cassandra.query.CassQuery#onQueryOverCQL3(com.impetus.kundera.metadata.model.EntityMetadata, com.impetus.kundera.client.Client, com.impetus.kundera.metadata.model.MetamodelImpl, java.util.List)}
     * .
     *
     * @throws InvocationTargetException
     * @throws IllegalAccessException
     * @throws IllegalArgumentException
     */
    @Test
    public void testOnQueryOverCQL3ForEmbeddedEntity() throws IllegalArgumentException, IllegalAccessException,
            InvocationTargetException
    {
        CassandraCli.createKeySpace("CompositeCassandra");
        String pu = "composite_pu";
        EntityManagerFactory emf = Persistence.createEntityManagerFactory(pu);
        EntityManager em = emf.createEntityManager();

        // Simple Query.
        String queryString = "Select u from CassandraPrimeUser u WHERE u.name = 'kk'";

        String cqlQuery = parseAndCreateCqlQuery(getQueryObject(queryString, emf), emf, em, pu,
                CassandraPrimeUser.class, 100);

        Assert.assertNotNull(cqlQuery);

        Assert.assertEquals("SELECT * FROM \"CompositeUser\" WHERE \"name\" = 'kk' LIMIT 100  ALLOW FILTERING", cqlQuery);

        // In Query.
        queryString = "Select u from CassandraPrimeUser u WHERE u.key.userId IN ('kk','dk','sk') ORDER BY u.key.tweetId ASC";

        cqlQuery = parseAndCreateCqlQuery(getQueryObject(queryString, emf), emf, em, pu, CassandraPrimeUser.class, 400);

        Assert.assertNotNull(cqlQuery);

        Assert.assertEquals(
                "SELECT * FROM \"CompositeUser\" WHERE \"userId\" IN ('kk', 'dk', 'sk')  ORDER BY \"tweetId\" ASC  LIMIT 400  ALLOW FILTERING",
                cqlQuery);

        // In Query set Paramater.
        queryString = "Select u from CassandraPrimeUser u WHERE u.key.userId IN :userIdList ORDER BY u.key.tweetId ASC";

        List<String> userIdList = new ArrayList<String>();
        userIdList.add("kk");
        userIdList.add("dk");
        userIdList.add("sk");

        KunderaQuery kunderaQuery = getQueryObject(queryString, emf);
        kunderaQuery.setParameter("userIdList", userIdList);

        cqlQuery = parseAndCreateCqlQuery(kunderaQuery, emf, em, pu, CassandraPrimeUser.class, Integer.MAX_VALUE);

        Assert.assertNotNull(cqlQuery);

        Assert.assertEquals(
                "SELECT * FROM \"CompositeUser\" WHERE \"userId\" IN ('kk', 'dk', 'sk' )   ORDER BY \"tweetId\" ASC   ALLOW FILTERING",
                cqlQuery);

        // In Query set Paramater with and clause.
        queryString = "Select u from CassandraPrimeUser u WHERE u.key.userId IN :userIdList and p.name = 'kuldeep' ORDER BY u.key.tweetId ASC";

        kunderaQuery = getQueryObject(queryString, emf);
        kunderaQuery.setParameter("userIdList", userIdList);

        cqlQuery = parseAndCreateCqlQuery(kunderaQuery, emf, em, pu, CassandraPrimeUser.class, 100);

        Assert.assertNotNull(cqlQuery);

        Assert.assertEquals(
                "SELECT * FROM \"CompositeUser\" WHERE \"userId\" IN ('kk', 'dk', 'sk' )  AND \"name\" = 'kuldeep'  ORDER BY \"tweetId\" ASC  LIMIT 100  ALLOW FILTERING",
                cqlQuery);

        // In Query set Paramater with gt clause.
        queryString = "Select u from CassandraPrimeUser u WHERE u.key IN :keyList";

        List<CassandraCompoundKey> personIdList = new ArrayList<CassandraCompoundKey>();
        UUID timeLineId1 = UUID.randomUUID();
        personIdList.add(new CassandraCompoundKey("kk", 1, timeLineId1));
        personIdList.add(new CassandraCompoundKey("vm", 2, timeLineId1));
        personIdList.add(new CassandraCompoundKey("vs", 3, timeLineId1));

        kunderaQuery = getQueryObject(queryString, emf);
        kunderaQuery.setParameter("keyList", personIdList);

        cqlQuery = parseAndCreateCqlQuery(kunderaQuery, emf, em, pu, CassandraPrimeUser.class, 100);

        Assert.assertNotNull(cqlQuery);
        Assert.assertTrue(cqlQuery.contains("SELECT * FROM \"CompositeUser\" WHERE "));
        Assert.assertTrue(cqlQuery.contains("\"timeLineId\" IN (" + timeLineId1 + ", " + timeLineId1 + ", "
                + timeLineId1 + " )"));
        Assert.assertTrue(cqlQuery.contains("\"userId\" IN ('kk', 'vm', 'vs' )"));
        Assert.assertTrue(cqlQuery.contains("\"tweetId\" IN (1, 2, 3 )"));
        Assert.assertTrue(cqlQuery.contains(" LIMIT 100"));
        Assert.assertTrue(cqlQuery.contains(" AND "));
        Assert.assertTrue(cqlQuery.indexOf(" AND ") > 0);

        // In Query over non pk field set Paramater with gt clause.
        queryString = "Select u from CassandraPrimeUser u WHERE u.key IN :keyList and u.name = 'vivek'";

        kunderaQuery = getQueryObject(queryString, emf);
        kunderaQuery.setParameter("keyList", personIdList);

        cqlQuery = parseAndCreateCqlQuery(kunderaQuery, emf, em, pu, CassandraPrimeUser.class, 100);

        Assert.assertNotNull(cqlQuery);
        Assert.assertTrue(cqlQuery.contains("SELECT * FROM \"CompositeUser\" WHERE "));
        Assert.assertTrue(cqlQuery.contains("\"timeLineId\" IN (" + timeLineId1 + ", " + timeLineId1 + ", "
                + timeLineId1 + " )"));
        Assert.assertTrue(cqlQuery.contains("\"userId\" IN ('kk', 'vm', 'vs' )"));
        Assert.assertTrue(cqlQuery.contains("\"tweetId\" IN (1, 2, 3 )"));
        Assert.assertTrue(cqlQuery.contains(" LIMIT 100"));
        Assert.assertTrue(cqlQuery.contains(" AND "));
        Assert.assertTrue(cqlQuery.contains("AND \"name\" = 'vivek'"));
        Assert.assertTrue(cqlQuery.indexOf(" AND ") > 0);

        em.close();
        emf.close();

        CassandraCli.dropKeySpace("CompositeCassandra");
    }

    /**
     * Test method for
     * {@link com.impetus.client.cassandra.query.CassQuery#onQueryOverCQL3(com.impetus.kundera.metadata.model.EntityMetadata, com.impetus.kundera.client.Client, com.impetus.kundera.metadata.model.MetamodelImpl, java.util.List)}
     * .
     *
     * @throws InvocationTargetException
     * @throws IllegalAccessException
     * @throws IllegalArgumentException
     */
    @Test
    public void testUpdateDeleteQuerySimpleEntity() throws IllegalArgumentException, IllegalAccessException,
            InvocationTargetException
    {
        CassandraCli.createKeySpace("KunderaExamples");
        String pu = "secIdxCassandraTest";
        EntityManagerFactory emf = Persistence.createEntityManagerFactory(pu);
        EntityManager em = emf.createEntityManager();

        // Simple Query.
        String queryString = "Update PersonCassandra p SET p.personName = 'Kuldeep' WHERE p.personId = '1'";

        String cqlQuery = parseAndCreateUpdateQuery(getQueryObject(queryString, emf), emf, em, pu,
                PersonCassandra.class, 200);

        Assert.assertNotNull(cqlQuery);

        Assert.assertEquals("UPDATE \"PERSONCASSANDRA\" SET \"PERSON_NAME\"='Kuldeep' WHERE \"personId\" = '1'", cqlQuery);

        // In Query.
        queryString = "Update PersonCassandra p SET p.personName = 'Kuldeep' WHERE p.personId IN ('1', '2', '3')";

        cqlQuery = parseAndCreateUpdateQuery(getQueryObject(queryString, emf), emf, em, pu, PersonCassandra.class, 400);

        Assert.assertNotNull(cqlQuery);

        Assert.assertEquals(
                "UPDATE \"PERSONCASSANDRA\" SET \"PERSON_NAME\"='Kuldeep' WHERE \"personId\" IN ('1', '2', '3')", cqlQuery);

        // In Query set Paramater.
        queryString = "Update PersonCassandra p SET p.personName = 'Kuldeep' WHERE p.personId IN :idList";

        List<String> id = new ArrayList<String>();
        id.add("1");
        id.add("2");
        id.add("3");

        KunderaQuery kunderaQuery = getQueryObject(queryString, emf);
        kunderaQuery.setParameter("idList", id);

        cqlQuery = parseAndCreateUpdateQuery(kunderaQuery, emf, em, pu, PersonCassandra.class, Integer.MAX_VALUE);

        Assert.assertNotNull(cqlQuery);

        Assert.assertEquals(
                "UPDATE \"PERSONCASSANDRA\" SET \"PERSON_NAME\"='Kuldeep' WHERE \"personId\" IN ('1', '2', '3' ) ", cqlQuery);

        // In Query set Paramater with and clause.
        queryString = "Update PersonCassandra p SET p.personName = 'Kuldeep' WHERE p.personId in :nameList and p.age = 10";

        kunderaQuery = getQueryObject(queryString, emf);
        kunderaQuery.setParameter("nameList", id);

        cqlQuery = parseAndCreateUpdateQuery(kunderaQuery, emf, em, pu, PersonCassandra.class, Integer.MAX_VALUE);

        Assert.assertNotNull(cqlQuery);

        Assert.assertEquals(
                "UPDATE \"PERSONCASSANDRA\" SET \"PERSON_NAME\"='Kuldeep' WHERE \"personId\" IN ('1', '2', '3' )  AND \"AGE\" = 10",
                cqlQuery);

        // In Query.
        queryString = "Delete from PersonCassandra p WHERE p.personId = '1'";

        cqlQuery = parseAndCreateDeleteQuery(getQueryObject(queryString, emf), emf, em, pu, PersonCassandra.class, 400);

        Assert.assertNotNull(cqlQuery);

        Assert.assertEquals("DELETE FROM \"PERSONCASSANDRA\" WHERE \"personId\" = '1'", cqlQuery);

        // In Query.
        queryString = "Delete from PersonCassandra p WHERE p.personId IN ('1', '2', '3')";

        cqlQuery = parseAndCreateDeleteQuery(getQueryObject(queryString, emf), emf, em, pu, PersonCassandra.class, 400);

        Assert.assertNotNull(cqlQuery);

        Assert.assertEquals("DELETE FROM \"PERSONCASSANDRA\" WHERE \"personId\" IN ('1', '2', '3')", cqlQuery);

        // In Query set Paramater.
        queryString = "Delete from PersonCassandra p WHERE p.personId IN :idList";

        kunderaQuery = getQueryObject(queryString, emf);
        kunderaQuery.setParameter("idList", id);

        cqlQuery = parseAndCreateDeleteQuery(kunderaQuery, emf, em, pu, PersonCassandra.class, Integer.MAX_VALUE);

        Assert.assertNotNull(cqlQuery);

        Assert.assertEquals("DELETE FROM \"PERSONCASSANDRA\" WHERE \"personId\" IN ('1', '2', '3' ) ", cqlQuery);

        // In Query over non pk field set Paramater with gt clause.
        queryString = "Delete from PersonCassandra p WHERE p.personId in :idList and p.age = 25";

        kunderaQuery = getQueryObject(queryString, emf);
        kunderaQuery.setParameter("idList", id);

        cqlQuery = parseAndCreateDeleteQuery(kunderaQuery, emf, em, pu, PersonCassandra.class, 100);

        Assert.assertNotNull(cqlQuery);

        Assert.assertEquals("DELETE FROM \"PERSONCASSANDRA\" WHERE \"personId\" IN ('1', '2', '3' )  AND \"AGE\" = 25",
                cqlQuery);

        em.close();
        emf.close();

        CassandraCli.dropKeySpace("KunderaExamples");
    }


    /**
     * Test method for
     * {@link com.impetus.client.cassandra.query.CassQuery#onQueryOverCQL3(com.impetus.kundera.metadata.model.EntityMetadata, com.impetus.kundera.client.Client, com.impetus.kundera.metadata.model.MetamodelImpl, java.util.List)}
     * .
     *
     * @throws InvocationTargetException
     * @throws IllegalAccessException
     * @throws IllegalArgumentException
     */
    @Test
    public void testUpdateQueryWithTTLSimpleEntity() throws IllegalArgumentException, IllegalAccessException,
            InvocationTargetException
    {
        CassandraCli.createKeySpace("KunderaExamples");
        String pu = "secIdxCassandraTest";
        EntityManagerFactory emf = Persistence.createEntityManagerFactory(pu);
        EntityManager em = emf.createEntityManager();

        // Simple Query.
        String queryString = "Update PersonCassandra p SET p.personName = 'Kuldeep' WHERE p.personId = '1'";

        String cqlQuery = parseAndCreateUpdateQuery(getQueryObject(queryString, emf), emf, em, pu,
                PersonCassandra.class, 200,100);

        Assert.assertNotNull(cqlQuery);

        Assert.assertEquals("UPDATE \"PERSONCASSANDRA\"  USING TTL 100 SET \"PERSON_NAME\"='Kuldeep' WHERE \"personId\" = '1'", cqlQuery);

        // In Query.
        queryString = "Update PersonCassandra p SET p.personName = 'Kuldeep' WHERE p.personId IN ('1', '2', '3')";

        cqlQuery = parseAndCreateUpdateQuery(getQueryObject(queryString, emf), emf, em, pu, PersonCassandra.class, 400, 200);

        Assert.assertNotNull(cqlQuery);

        Assert.assertEquals(
                "UPDATE \"PERSONCASSANDRA\"  USING TTL 200 SET \"PERSON_NAME\"='Kuldeep' WHERE \"personId\" IN ('1', '2', '3')", cqlQuery);

        // In Query set Paramater.
        queryString = "Update PersonCassandra p SET p.personName = 'Kuldeep' WHERE p.personId IN :idList";

        List<String> id = new ArrayList<String>();
        id.add("1");
        id.add("2");
        id.add("3");

        KunderaQuery kunderaQuery = getQueryObject(queryString, emf);
        kunderaQuery.setParameter("idList", id);

        cqlQuery = parseAndCreateUpdateQuery(kunderaQuery, emf, em, pu, PersonCassandra.class, Integer.MAX_VALUE, 1000);

        Assert.assertNotNull(cqlQuery);

        Assert.assertEquals(
                "UPDATE \"PERSONCASSANDRA\"  USING TTL 1000 SET \"PERSON_NAME\"='Kuldeep' WHERE \"personId\" IN ('1', '2', '3' ) ", cqlQuery);

        // In Query set Paramater with and clause.
        queryString = "Update PersonCassandra p SET p.personName = 'Kuldeep' WHERE p.personId in :nameList and p.age = 10";

        kunderaQuery = getQueryObject(queryString, emf);
        kunderaQuery.setParameter("nameList", id);

        cqlQuery = parseAndCreateUpdateQuery(kunderaQuery, emf, em, pu, PersonCassandra.class, Integer.MAX_VALUE);

        Assert.assertNotNull(cqlQuery);

        Assert.assertEquals(
                "UPDATE \"PERSONCASSANDRA\" SET \"PERSON_NAME\"='Kuldeep' WHERE \"personId\" IN ('1', '2', '3' )  AND \"AGE\" = 10",
                cqlQuery);

        em.close();
        emf.close();

        CassandraCli.dropKeySpace("KunderaExamples");
    }

    /**
     * Test method for
     * {@link com.impetus.client.cassandra.query.CassQuery#onQueryOverCQL3(com.impetus.kundera.metadata.model.EntityMetadata, com.impetus.kundera.client.Client, com.impetus.kundera.metadata.model.MetamodelImpl, java.util.List)}
     * .
     *
     * @throws InvocationTargetException
     * @throws IllegalAccessException
     * @throws IllegalArgumentException
     */
    @Test
    public void testUpdateDeleteQueryEmbeddedEntity() throws IllegalArgumentException, IllegalAccessException,
            InvocationTargetException
    {
        CassandraCli.createKeySpace("CompositeCassandra");
        String pu = "composite_pu";
        EntityManagerFactory emf = Persistence.createEntityManagerFactory(pu);
        EntityManager em = emf.createEntityManager();

        // Simple Query.
        String queryString = "Update CassandraPrimeUser u SET u.name = 'Kuldeep' WHERE u.name = 'kk'";

        String cqlQuery = parseAndCreateUpdateQuery(getQueryObject(queryString, emf), emf, em, pu,
                CassandraPrimeUser.class, 100);

        Assert.assertNotNull(cqlQuery);

        Assert.assertEquals("UPDATE \"CompositeUser\" SET \"name\"='Kuldeep' WHERE \"name\" = 'kk'", cqlQuery);

        // In Query.
        queryString = "Update CassandraPrimeUser u SET u.name = 'Kuldeep' WHERE u.key.userId IN ('kk','dk','sk')";

        cqlQuery = parseAndCreateUpdateQuery(getQueryObject(queryString, emf), emf, em, pu, CassandraPrimeUser.class,
                400);

        Assert.assertNotNull(cqlQuery);

        Assert.assertEquals("UPDATE \"CompositeUser\" SET \"name\"='Kuldeep' WHERE \"userId\" IN ('kk', 'dk', 'sk')",
                cqlQuery);

        // In Query set Paramater.
        queryString = "Update CassandraPrimeUser u SET u.name = 'Kuldeep' WHERE u.key.userId IN :userIdList";

        List<String> userIdList = new ArrayList<String>();
        userIdList.add("kk");
        userIdList.add("dk");
        userIdList.add("sk");

        KunderaQuery kunderaQuery = getQueryObject(queryString, emf);
        kunderaQuery.setParameter("userIdList", userIdList);

        cqlQuery = parseAndCreateUpdateQuery(kunderaQuery, emf, em, pu, CassandraPrimeUser.class, Integer.MAX_VALUE);

        Assert.assertNotNull(cqlQuery);

        Assert.assertEquals("UPDATE \"CompositeUser\" SET \"name\"='Kuldeep' WHERE \"userId\" IN ('kk', 'dk', 'sk' ) ",
                cqlQuery);

        // Simple Query.
        queryString = "Delete from CassandraPrimeUser u WHERE u.name = 'kk'";

        cqlQuery = parseAndCreateDeleteQuery(getQueryObject(queryString, emf), emf, em, pu, CassandraPrimeUser.class,
                100);

        Assert.assertNotNull(cqlQuery);

        Assert.assertEquals("DELETE FROM \"CompositeUser\" WHERE \"name\" = 'kk'", cqlQuery);

        // In Query.
        queryString = "Delete from CassandraPrimeUser u WHERE u.key.userId IN ('kk', 'dk', 'sk' )";

        cqlQuery = parseAndCreateDeleteQuery(getQueryObject(queryString, emf), emf, em, pu, CassandraPrimeUser.class,
                400);

        Assert.assertNotNull(cqlQuery);

        Assert.assertEquals("DELETE FROM \"CompositeUser\" WHERE \"userId\" IN ('kk', 'dk', 'sk')", cqlQuery);

        // In Query set Paramater with and clause.
        queryString = "Delete from CassandraPrimeUser u WHERE u.key.userId IN :userIdList";

        kunderaQuery = getQueryObject(queryString, emf);
        kunderaQuery.setParameter("userIdList", userIdList);

        cqlQuery = parseAndCreateDeleteQuery(kunderaQuery, emf, em, pu, CassandraPrimeUser.class, 100);

        Assert.assertNotNull(cqlQuery);

        Assert.assertEquals("DELETE FROM \"CompositeUser\" WHERE \"userId\" IN ('kk', 'dk', 'sk' ) ", cqlQuery);

        em.close();
        emf.close();

        CassandraCli.dropKeySpace("CompositeCassandra");
    }

    /**
     *
     * @param kunderaQuery
     * @return
     */
    private String parseAndCreateCqlQuery(KunderaQuery kunderaQuery, EntityManagerFactory emf, EntityManager em,
            String puName, Class entityClass, Integer maxResult)
    {
        Method getpd = null;
        try
        {
            getpd = EntityManagerImpl.class.getDeclaredMethod("getPersistenceDelegator");
        }
        catch (Exception e)
        {
            log.error("Error during execution, Caused by : ",e.getMessage());
        }
       
        getpd.setAccessible(true);
        PersistenceDelegator pd = getPersistenceDelegator(em, getpd);

        KunderaMetadata kunderaMetadata = ((EntityManagerFactoryImpl) emf).getKunderaMetadataInstance();

        CassQuery query = new CassQuery(kunderaQuery, pd, kunderaMetadata);
        query.setMaxResults(maxResult);

        EntityMetadata metadata = KunderaMetadataManager.getEntityMetadata(kunderaMetadata, entityClass);
        Metamodel metaModel = KunderaMetadataManager.getMetamodel(kunderaMetadata, puName);

        Client<CassQuery> client = pd.getClient(metadata);

        String cqlQuery = query.onQueryOverCQL3(metadata, client, (MetamodelImpl) metaModel,
                metadata.getRelationNames());
        return cqlQuery;
    }

    private PersistenceDelegator getPersistenceDelegator(EntityManager em, Method getpd)
    {
        PersistenceDelegator pd = null;
        try
        {
            pd = (PersistenceDelegator) getpd.invoke(em);
        }
        catch (Exception e)
        {
            log.error("Error during execution, Caused by : ",e.getMessage());
        }
        return pd;
    }

    /**
     * Parse and create update query.
     *
     * @param kunderaQuery  kundera query.
     * @param emf  entity manager factory.
     * @param em   entity manager
     * @param puName     persistence unit name.
     * @param entityClass  entity class.
     * @param maxResult max result.
     *
     * @return parsed query.
     */
    private String parseAndCreateUpdateQuery(KunderaQuery kunderaQuery, EntityManagerFactory emf, EntityManager em,
            String puName, Class entityClass, Integer maxResult)
    {
        return parseAndCreateUpdateQuery(kunderaQuery, emf, em, puName, entityClass, maxResult, null);
    }
    /**
     *
     * @param kunderaQuery
     * @return
     */
    private String parseAndCreateUpdateQuery(KunderaQuery kunderaQuery, EntityManagerFactory emf, EntityManager em,
            String puName, Class entityClass, Integer maxResult, Integer ttl)
    {
        Method getpd = null;
        try
        {
            getpd = EntityManagerImpl.class.getDeclaredMethod("getPersistenceDelegator");
        }
        catch (SecurityException e)
        {
          log.warn(e.getMessage());
        }
        catch (NoSuchMethodException e)
        {
          log.warn(e.getMessage());
        }
        getpd.setAccessible(true);
//        PersistenceDelegator pd = null;
        PersistenceDelegator pd = getPersistenceDelegator(em, getpd);
        KunderaMetadata kunderaMetadata = ((EntityManagerFactoryImpl) emf).getKunderaMetadataInstance();

        CassQuery query = new CassQuery(kunderaQuery, pd, kunderaMetadata);
        query.setMaxResults(maxResult);
        if(ttl != null)
        {
            query.applyTTL(ttl);
        }
       
        String cqlQuery = query.createUpdateQuery(kunderaQuery);
        return cqlQuery;
    }

    /**
     *
     * @param kunderaQuery
     * @return
     */
    private String parseAndCreateDeleteQuery(KunderaQuery kunderaQuery, EntityManagerFactory emf, EntityManager em,
            String puName, Class entityClass, Integer maxResult)
    {
        Method getpd = null;
        try
        {
            getpd = EntityManagerImpl.class.getDeclaredMethod("getPersistenceDelegator");
        }
        catch (SecurityException e)
        {
          log.warn(e.getMessage());
        }
        catch (NoSuchMethodException e)
        {
          log.warn(e.getMessage());
        }
        getpd.setAccessible(true);
        PersistenceDelegator pd = null;
        try
        {
            pd = (PersistenceDelegator) getpd.invoke(em);
        }
        catch (IllegalArgumentException e)
        {
          log.warn(e.getMessage());
        }
        catch (IllegalAccessException e)
        {
          log.warn(e.getMessage());
        }
        catch (InvocationTargetException e)
        {
          log.warn(e.getMessage());
        }

        KunderaMetadata kunderaMetadata = ((EntityManagerFactoryImpl) emf).getKunderaMetadataInstance();

        CassQuery query = new CassQuery(kunderaQuery, pd, kunderaMetadata);
        query.setMaxResults(maxResult);

        String cqlQuery = query.createDeleteQuery(kunderaQuery);
        return cqlQuery;
    }

    /**
     *
     * @param queryString
     * @return
     */
    private KunderaQuery getQueryObject(String queryString, EntityManagerFactory emf)
    {
        Method getpostParsingInit = null;
        try
        {
            getpostParsingInit = KunderaQuery.class.getDeclaredMethod("postParsingInit");
        }
        catch (SecurityException e)
        {
          log.warn(e.getMessage());
        }
        catch (NoSuchMethodException e)
        {
          log.warn(e.getMessage());
        }
        getpostParsingInit.setAccessible(true);

        KunderaMetadata kunderaMetadata = ((EntityManagerFactoryImpl) emf).getKunderaMetadataInstance();
        KunderaQuery kunderaQuery = new KunderaQuery(queryString, kunderaMetadata);
        KunderaQueryParser queryParser = new KunderaQueryParser(kunderaQuery);
        queryParser.parse();
        try
        {
            getpostParsingInit.invoke(kunderaQuery);
        }
        catch (IllegalArgumentException e)
        {
          log.warn(e.getMessage());
        }
        catch (IllegalAccessException e)
        {
          log.warn(e.getMessage());
        }
        catch (InvocationTargetException e)
        {
          log.warn(e.getMessage());
        }

        return kunderaQuery;
    }
}
TOP

Related Classes of com.impetus.client.cassandra.query.CassQueryTest

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.