Skip to content

Commit

Permalink
Merge branch 'trunk' of github.com:impetus-opensource/Kundera into trunk
Browse files Browse the repository at this point in the history
  • Loading branch information
mevivs committed Aug 14, 2013
2 parents d9aacc0 + 9ee3cac commit 6b7dcf8
Show file tree
Hide file tree
Showing 14 changed files with 376 additions and 135 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
import javax.persistence.metamodel.EmbeddableType;
import javax.persistence.metamodel.EntityType;

import org.apache.cassandra.cql3.CQL3Type;
import org.apache.cassandra.thrift.Cassandra;
import org.apache.cassandra.thrift.CfDef;
import org.apache.cassandra.thrift.Column;
Expand Down Expand Up @@ -100,6 +101,9 @@
import com.impetus.kundera.property.PropertyAccessException;
import com.impetus.kundera.property.PropertyAccessorFactory;
import com.impetus.kundera.property.PropertyAccessorHelper;
import com.impetus.kundera.query.KunderaQuery;
import com.impetus.kundera.query.KunderaQuery.FilterClause;
import com.impetus.kundera.query.KunderaQuery.UpdateClause;

/**
* Base Class for all Cassandra Clients Contains methods that are applicable to
Expand Down Expand Up @@ -707,7 +711,7 @@ public <E> List<E> find(Class<E> entityClass, Map<String, String> superColumnMap
}

/**
* Executes Query.
* Executes Select CQL Query.
*
* @param cqlQuery
* the cql query
Expand All @@ -719,7 +723,7 @@ public <E> List<E> find(Class<E> entityClass, Map<String, String> superColumnMap
* the data handler
* @return the list
*/
public List executeQuery(String cqlQuery, Class clazz, List<String> relationalField,
public List executeSelectQuery(String cqlQuery, Class clazz, List<String> relationalField,
CassandraDataHandler dataHandler)
{
if (log.isInfoEnabled())
Expand All @@ -728,6 +732,31 @@ public List executeQuery(String cqlQuery, Class clazz, List<String> relationalFi
}
return cqlClient.executeQuery(cqlQuery, clazz, relationalField, dataHandler, false);
}

/**
* Executes Update/ Delete CQL query
* @param cqlQuery
* @return
*/
public int executeUpdateDeleteQuery(String cqlQuery)
{
if (log.isInfoEnabled())
{
log.info("Executing cql query {}.", cqlQuery);
}
try
{
CqlResult result = executeCQLQuery(cqlQuery, true);
return result.getNum();
}
catch (Exception e)
{
log.error("Error while executing updated query: {}, Caused by: . ",
cqlQuery, e);
return 0;
}

}

public Map<String, Object> getExternalProperties()
{
Expand Down Expand Up @@ -910,6 +939,11 @@ protected String createInsertQuery(EntityMetadata entityMetadata, Object entity,
}
return insert_Query;
}






/**
* Return update query string for given entity intended for counter column
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -641,7 +641,7 @@ public final List<SuperColumn> loadSuperColumns(String keyspace, String columnFa
@Override
public List executeQuery(String cqlQuery, Class clazz, List<String> relationalField)
{
return super.executeQuery(cqlQuery, clazz, relationalField, dataHandler);
return super.executeSelectQuery(cqlQuery, clazz, relationalField, dataHandler);
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,12 +17,16 @@

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import javassist.Modifier;

import javax.persistence.Transient;
import javax.persistence.metamodel.Attribute;
import javax.persistence.metamodel.EmbeddableType;
import javax.persistence.metamodel.EntityType;
Expand Down Expand Up @@ -57,6 +61,7 @@
import com.impetus.kundera.property.PropertyAccessorHelper;
import com.impetus.kundera.query.KunderaQuery;
import com.impetus.kundera.query.KunderaQuery.FilterClause;
import com.impetus.kundera.query.KunderaQuery.UpdateClause;
import com.impetus.kundera.query.QueryHandlerException;
import com.impetus.kundera.query.QueryImpl;
import com.impetus.kundera.utils.ReflectUtils;
Expand Down Expand Up @@ -236,14 +241,62 @@ protected int onExecuteUpdate()
((CassandraClientBase) persistenceDelegeator.getClient(m)).executeQuery(KunderaMetadata.INSTANCE
.getApplicationMetadata().getQuery(getJPAQuery()), m.getEntityClazz(), null);
}
else if (kunderaQuery.isDeleteUpdate())
{
List result = getResultList();
return result != null ? result.size() : 0;
else if (kunderaQuery.isDeleteUpdate() )
{
//If query is not convertible to CQL, fetch and merge records usual way, otherwise
// convert to CQL and execute
if(! isQueryConvertibleToCQL(kunderaQuery))
{
List result = getResultList();
return result != null ? result.size() : 0;
}
else
{
String query = null;
if(kunderaQuery.isUpdateClause())
{
query = createUpdateQuery(kunderaQuery);
}
else
{
query = createDeleteQuery(kunderaQuery);
}
return ((CassandraClientBase) persistenceDelegeator.getClient(m)).executeUpdateDeleteQuery(query);
}

}
return 0;
}

/**
* Checks whether a given JPA DML query is convertible to CQL
* @param m
* @return
*/
private boolean isQueryConvertibleToCQL(KunderaQuery kunderaQuery)
{
EntityMetadata m = kunderaQuery.getEntityMetadata();
if(kunderaQuery.isUpdateClause() && m.isCounterColumnType()) return false;

List<String> opsNotAllowed = Arrays.asList(new String[]{">", "<", ">=", "<="});
boolean result = false;
if(! kunderaQuery.getFilterClauseQueue().isEmpty())
{
String idColumn = ((AbstractAttribute) m.getIdAttribute()).getJPAColumnName();
for(Object o : kunderaQuery.getFilterClauseQueue())
{
FilterClause filterClause = (FilterClause) o;
if(! idColumn.equals(filterClause.getProperty()) || opsNotAllowed.contains(filterClause.getCondition()))
{
result = false;
break;
}
result = true;
}
}
return result;
}

/**
* Gets the column list.
*
Expand Down Expand Up @@ -766,5 +819,147 @@ public Object getSingleResult()
isSingleResult = false;
return results.isEmpty() ? results : results.get(0);
}

/**
* Create Update CQL query from a given JPA query.
* @param kunderaQuery
* @return
*/
public String createUpdateQuery(KunderaQuery kunderaQuery)
{
EntityMetadata metadata = kunderaQuery.getEntityMetadata();
MetamodelImpl metaModel = (MetamodelImpl) KunderaMetadata.INSTANCE.getApplicationMetadata().getMetamodel(
metadata.getPersistenceUnit());

CQLTranslator translator = new CQLTranslator();
String update_Query = translator.UPDATE_QUERY;

String tableName = metadata.getTableName();
update_Query = StringUtils.replace(update_Query, CQLTranslator.COLUMN_FAMILY,
translator.ensureCase(new StringBuilder(), tableName).toString());

StringBuilder builder = new StringBuilder(update_Query);

Object ttlColumns = ((CassandraClientBase) persistenceDelegeator.getClient(metadata)).getTtlValues().get(metadata.getTableName());
if (ttlColumns != null && ttlColumns instanceof Integer)
{
int ttl = ((Integer) ttlColumns).intValue();
if (ttl != 0)
{
builder.append(" USING TTL ");
builder.append(ttl);
}
}

builder.append(CQLTranslator.ADD_SET_CLAUSE);

for(UpdateClause updateClause : kunderaQuery.getUpdateClauseQueue())
{

String property = updateClause.getProperty();

String jpaColumnName = getColumnName(metadata, property);

Object value = updateClause.getValue();

translator.buildSetClause(metadata, builder, jpaColumnName, value);
}
builder.delete(builder.lastIndexOf(CQLTranslator.COMMA_STR), builder.length());
builder.append(CQLTranslator.ADD_WHERE_CLAUSE);
buildWhereClause(kunderaQuery, metadata, metaModel, translator, builder);



return builder.toString();
}

/**
* Create Delete query from a given JPA query
* @param kunderaQuery
* @return
*/
public String createDeleteQuery(KunderaQuery kunderaQuery)
{
EntityMetadata metadata = kunderaQuery.getEntityMetadata();
MetamodelImpl metaModel = (MetamodelImpl) KunderaMetadata.INSTANCE.getApplicationMetadata().getMetamodel(
metadata.getPersistenceUnit());
CQLTranslator translator = new CQLTranslator();
String delete_query = translator.DELETE_QUERY;

String tableName = kunderaQuery.getEntityMetadata().getTableName();
delete_query = StringUtils.replace(delete_query, CQLTranslator.COLUMN_FAMILY,
translator.ensureCase(new StringBuilder(), tableName).toString());

StringBuilder builder = new StringBuilder(delete_query);
builder.append(CQLTranslator.ADD_WHERE_CLAUSE);
buildWhereClause(kunderaQuery, metadata, metaModel, translator, builder);
return builder.toString();
}

/**
* Builds where Clause
* @param kunderaQuery
* @param metadata
* @param metaModel
* @param translator
* @param builder
*/
private void buildWhereClause(KunderaQuery kunderaQuery, EntityMetadata metadata, MetamodelImpl metaModel,
CQLTranslator translator, StringBuilder builder)
{
for(Object clause : kunderaQuery.getFilterClauseQueue())
{
FilterClause filterClause = (FilterClause) clause;
Field f = (Field) metaModel.entity(metadata.getEntityClazz()).getAttribute(metadata.getFieldName(filterClause.getProperty())).getJavaMember();
String jpaColumnName = getColumnName(metadata, filterClause.getProperty());

if (metaModel.isEmbeddable(metadata.getIdAttribute().getBindableJavaType()))
{
Field[] fields = metadata.getIdAttribute().getBindableJavaType().getDeclaredFields();
EmbeddableType compoundKey = metaModel.embeddable(metadata.getIdAttribute().getBindableJavaType());
for (Field field : fields)
{
if (field != null && !Modifier.isStatic(field.getModifiers())
&& !Modifier.isTransient(field.getModifiers()) && !field.isAnnotationPresent(Transient.class))
{
Attribute attribute = compoundKey.getAttribute(field.getName());
String columnName = ((AbstractAttribute) attribute).getJPAColumnName();
Object value = PropertyAccessorHelper.getObject(filterClause.getValue(), field);
translator.buildWhereClause(builder, field.getType(), columnName, value, filterClause.getCondition());
}
}
}
else
{
translator.buildWhereClause(builder, f.getType(), jpaColumnName, filterClause.getValue(), filterClause.getCondition());
}

}
builder.delete(builder.lastIndexOf(CQLTranslator.AND_CLAUSE), builder.length());
}

/**
* Gets column name for a given field name
* @param metadata
* @param metaModel
* @param property
* @return
*/
private String getColumnName(EntityMetadata metadata, String property)
{
MetamodelImpl metaModel = (MetamodelImpl) KunderaMetadata.INSTANCE.getApplicationMetadata().getMetamodel(
metadata.getPersistenceUnit());
String jpaColumnName = null;

if(property.equals(((AbstractAttribute)metadata.getIdAttribute()).getJPAColumnName()))
{
jpaColumnName = CassandraUtilities.getIdColumnName(metadata, ((CassandraClientBase) persistenceDelegeator.getClient(metadata)).getExternalProperties());
}
else
{
jpaColumnName = ((AbstractAttribute) metaModel.getEntityAttribute(metadata.getEntityClazz(), property)).getJPAColumnName();
}
return jpaColumnName;
}

}
Loading

0 comments on commit 6b7dcf8

Please sign in to comment.