
com.impetus.spark.client.SparkClient Maven / Gradle / Ivy
/*******************************************************************************
* * Copyright 2015 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.spark.client;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang.StringUtils;
import org.apache.spark.SparkContext;
import org.apache.spark.sql.DataFrame;
import org.apache.spark.sql.hive.HiveContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.impetus.kundera.client.Client;
import com.impetus.kundera.client.ClientBase;
import com.impetus.kundera.client.ClientPropertiesSetter;
import com.impetus.kundera.db.RelationHolder;
import com.impetus.kundera.generator.Generator;
import com.impetus.kundera.metadata.KunderaMetadataManager;
import com.impetus.kundera.metadata.model.EntityMetadata;
import com.impetus.kundera.metadata.model.PersistenceUnitMetadata;
import com.impetus.kundera.persistence.EntityManagerFactoryImpl.KunderaMetadata;
import com.impetus.kundera.persistence.EntityReader;
import com.impetus.kundera.persistence.context.jointable.JoinTableData;
import com.impetus.kundera.query.KunderaQuery;
import com.impetus.spark.constants.SparkQueryConstants;
import com.impetus.spark.datahandler.SparkDataHandler;
import com.impetus.spark.query.SparkQuery;
/**
* The Class SparkClient.
*
* @author: karthikp.manchala
*/
public class SparkClient extends ClientBase implements Client, ClientPropertiesSetter
{
/** The Constant DATA_CLIENT. */
private static final String DATA_CLIENT = "kundera.client";
/** The spark context. */
final SparkContext sparkContext;
/** The sql context. */
final HiveContext sqlContext;
/** The properties. */
Map properties = new HashMap();
/** The reader. */
private EntityReader reader;
/** The logger. */
private static Logger logger = LoggerFactory.getLogger(SparkClient.class);
/** The registered tables. */
private static Map registeredTables = new HashMap();
/** The data handler. */
private SparkDataHandler dataHandler = new SparkDataHandler(kunderaMetadata);
/**
* Instantiates a new spark client.
*
* @param kunderaMetadata
* the kundera metadata
* @param reader
* the reader
* @param properties
* the properties
* @param persistenceUnit
* the persistence unit
* @param sparkContext
* the spark context
* @param sqlContext
* the sql context
*/
protected SparkClient(KunderaMetadata kunderaMetadata, EntityReader reader, Map properties,
String persistenceUnit, SparkContext sparkContext, HiveContext sqlContext)
{
super(kunderaMetadata, properties, persistenceUnit);
this.reader = reader;
this.sparkContext = sparkContext;
this.sqlContext = sqlContext;
}
/*
* (non-Javadoc)
*
* @see com.impetus.kundera.client.Client#find(java.lang.Class,
* java.lang.Object)
*/
public Object find(Class entityClass, Object key)
{
EntityMetadata entityMetadata = KunderaMetadataManager.getEntityMetadata(kunderaMetadata, entityClass);
String tableName = entityMetadata.getTableName();
Class fieldClass = entityMetadata.getIdAttribute().getJavaType();
String select_Query = SparkQueryConstants.SELECTALL_QUERY;
select_Query = StringUtils.replace(select_Query, SparkQueryConstants.TABLE, tableName);
StringBuilder builder = new StringBuilder(select_Query);
builder.append(SparkQueryConstants.ADD_WHERE_CLAUSE);
builder.append(dataHandler.getColumnName(entityMetadata.getIdAttribute()));
builder.append(SparkQueryConstants.EQUALS);
appendValue(builder, fieldClass, key);
List result = this.executeQuery(builder.toString(), entityMetadata, null);
return result.isEmpty() ? null : result.get(0);
}
/**
* Append value.
*
* @param builder
* the builder
* @param fieldClazz
* the field clazz
* @param value
* the value
*/
private void appendValue(StringBuilder builder, Class fieldClazz, Object value)
{
if (fieldClazz != null
&& value != null
&& (fieldClazz.isAssignableFrom(String.class) || fieldClazz.isAssignableFrom(char.class)
|| fieldClazz.isAssignableFrom(Character.class) || value instanceof Enum))
{
if (fieldClazz.isAssignableFrom(String.class))
{
// To allow escape character
value = ((String) value).replaceAll("'", "''");
}
builder.append("'");
if (value instanceof Enum)
{
builder.append(((Enum) value).name());
}
else
{
builder.append(value);
}
builder.append("'");
}
else
{
builder.append(value);
}
}
/*
* (non-Javadoc)
*
* @see com.impetus.kundera.client.Client#close()
*/
public void close()
{
registeredTables.clear();
}
/*
* (non-Javadoc)
*
* @see
* com.impetus.kundera.client.Client#persistJoinTable(com.impetus.kundera
* .persistence.context.jointable.JoinTableData)
*/
public void persistJoinTable(JoinTableData joinTableData)
{
// TODO Auto-generated method stub
}
/*
* (non-Javadoc)
*
* @see com.impetus.kundera.client.Client#findIdsByColumn(java.lang.String,
* java.lang.String, java.lang.String, java.lang.String, java.lang.Object,
* java.lang.Class)
*/
public Object[] findIdsByColumn(String schemaName, String tableName, String pKeyName, String columnName,
Object columnValue, Class entityClazz)
{
// TODO Auto-generated method stub
return null;
}
/*
* (non-Javadoc)
*
* @see com.impetus.kundera.client.Client#deleteByColumn(java.lang.String,
* java.lang.String, java.lang.String, java.lang.Object)
*/
public void deleteByColumn(String schemaName, String tableName, String columnName, Object columnValue)
{
// TODO Auto-generated method stub
}
/*
* (non-Javadoc)
*
* @see com.impetus.kundera.client.Client#findByRelation(java.lang.String,
* java.lang.Object, java.lang.Class)
*/
public List findByRelation(String colName, Object colValue, Class entityClazz)
{
// TODO Auto-generated method stub
return null;
}
/*
* (non-Javadoc)
*
* @see com.impetus.kundera.client.Client#getReader()
*/
public EntityReader getReader()
{
return reader;
}
/*
* (non-Javadoc)
*
* @see com.impetus.kundera.client.Client#getQueryImplementor()
*/
public Class getQueryImplementor()
{
// TODO Auto-generated method stub
return SparkQuery.class;
}
/*
* (non-Javadoc)
*
* @see com.impetus.kundera.client.Client#getIdGenerator()
*/
public Generator getIdGenerator()
{
// TODO Auto-generated method stub
return null;
}
/*
* (non-Javadoc)
*
* @see
* com.impetus.kundera.client.ClientBase#onPersist(com.impetus.kundera.metadata
* .model.EntityMetadata, java.lang.Object, java.lang.Object,
* java.util.List)
*/
@Override
protected void onPersist(EntityMetadata entityMetadata, Object entity, Object id, List rlHolders)
{
// TODO Auto-generated method stub
// handle persist object
PersistenceUnitMetadata puMetadata = kunderaMetadata.getApplicationMetadata().getPersistenceUnitMetadata(
persistenceUnit);
String clientName = puMetadata.getProperty(DATA_CLIENT).toLowerCase();
List listEntity = new ArrayList<>();
listEntity.add(entity);
SparkDataClient dataClient = SparkDataClientFactory.getDataClient(clientName);
dataClient.persist(listEntity, entityMetadata, this);
}
/*
* (non-Javadoc)
*
* @see com.impetus.kundera.client.ClientBase#delete(java.lang.Object,
* java.lang.Object)
*/
@Override
protected void delete(Object entity, Object pKey)
{
// TODO Auto-generated method stub
}
/**
* Execute query.
*
* @param query
* the query
* @param m
* the m
* @param kunderaQuery
* the kundera query
* @return the list
*/
public List executeQuery(String query, EntityMetadata m, KunderaQuery kunderaQuery)
{
DataFrame dataFrame = getDataFrame(query, m, kunderaQuery);
// dataFrame.show();
return dataHandler.loadDataAndPopulateResults(dataFrame, m, kunderaQuery);
}
/**
* Gets the data frame.
*
* @param query
* the query
* @param m
* the m
* @param kunderaQuery
* the kundera query
* @return the data frame
*/
public DataFrame getDataFrame(String query, EntityMetadata m, KunderaQuery kunderaQuery)
{
PersistenceUnitMetadata puMetadata = kunderaMetadata.getApplicationMetadata().getPersistenceUnitMetadata(
persistenceUnit);
String clientName = puMetadata.getProperty(DATA_CLIENT).toLowerCase();
SparkDataClient dataClient = SparkDataClientFactory.getDataClient(clientName);
if (registeredTables.get(m.getTableName()) == null || !registeredTables.get(m.getTableName()))
{
dataClient.registerTable(m, this);
registeredTables.put(m.getTableName(), true);
}
// at this level temp table or table should be ready
DataFrame dataFrame = sqlContext.sql(query);
return dataFrame;
}
/*
* (non-Javadoc)
*
* @see
* com.impetus.kundera.client.ClientPropertiesSetter#populateClientProperties
* (com.impetus.kundera.client.Client, java.util.Map)
*/
@Override
public void populateClientProperties(Client client, Map properties)
{
this.properties.putAll(properties);
}
/*
* (non-Javadoc)
*
* @see com.impetus.kundera.client.Client#findAll(java.lang.Class,
* java.lang.String[], java.lang.Object[])
*/
@Override
public List findAll(Class entityClass, String[] columnsToSelect, Object... keys)
{
// TODO Auto-generated method stub
return null;
}
/*
* (non-Javadoc)
*
* @see com.impetus.kundera.client.Client#find(java.lang.Class,
* java.util.Map)
*/
@Override
public List find(Class entityClass, Map embeddedColumnMap)
{
// TODO Auto-generated method stub
return null;
}
/*
* (non-Javadoc)
*
* @see com.impetus.kundera.client.Client#getColumnsById(java.lang.String,
* java.lang.String, java.lang.String, java.lang.String, java.lang.Object,
* java.lang.Class)
*/
@Override
public List getColumnsById(String schemaName, String tableName, String pKeyColumnName, String columnName,
Object pKeyColumnValue, Class columnJavaType)
{
// TODO Auto-generated method stub
return null;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy