package com.bagri.test.tpox.workload;
import static com.bagri.core.Constants.pn_client_bufferSize;
import static com.bagri.core.Constants.pn_client_connectAttempts;
import static com.bagri.core.Constants.pn_client_loginTimeout;
import static com.bagri.core.Constants.pn_schema_address;
import static com.bagri.core.Constants.pn_schema_name;
import static com.bagri.core.Constants.pn_schema_password;
import static com.bagri.core.Constants.pn_schema_user;
import static com.bagri.xqj.BagriXQDataSource.ADDRESS;
import static com.bagri.xqj.BagriXQDataSource.PASSWORD;
import static com.bagri.xqj.BagriXQDataSource.SCHEMA;
import static com.bagri.xqj.BagriXQDataSource.USER;
import static com.bagri.xqj.BagriXQDataSource.XDM_REPOSITORY;
import static com.bagri.xqj.BagriXQDataSource.XQ_PROCESSOR;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import javax.xml.xquery.XQConnection;
import javax.xml.xquery.XQDataSource;
import javax.xml.xquery.XQException;
import net.sf.tpox.databaseoperations.DatabaseOperations;
import net.sf.tpox.workload.parameter.ActualParamInfo;
import net.sf.tpox.workload.transaction.Transaction;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.bagri.core.api.ResultCursor;
import com.bagri.core.api.SchemaRepository;
import com.bagri.core.api.BagriException;
import com.bagri.core.model.Document;
import com.bagri.core.system.Parameter;
import com.bagri.core.test.ClientQueryManagementTest;
import com.bagri.xqj.BagriXQDataFactory;
import com.bagri.xqj.BagriXQDataSource;
public class BagriDBPlugin extends BagriTPoXPlugin {
private static final transient Logger logger = LoggerFactory.getLogger(BagriDBPlugin.class);
private static final XQDataSource xqds;
static {
xqds = new BagriXQDataSource();
try {
xqds.setProperty(ADDRESS, System.getProperty(pn_schema_address));
xqds.setProperty(SCHEMA, System.getProperty(pn_schema_name));
xqds.setProperty(USER, System.getProperty(pn_schema_user));
xqds.setProperty(PASSWORD, System.getProperty(pn_schema_password));
xqds.setProperty(XQ_PROCESSOR, "com.bagri.xquery.saxon.XQProcessorClient");
xqds.setProperty(XDM_REPOSITORY, "com.bagri.client.hazelcast.impl.SchemaRepositoryImpl");
String value = System.getProperty(pn_client_loginTimeout);
if (value != null) {
xqds.setProperty(pn_client_loginTimeout, value);
}
value = System.getProperty(pn_client_bufferSize);
if (value != null) {
xqds.setProperty(pn_client_bufferSize, value);
}
value = System.getProperty(pn_client_connectAttempts);
if (value != null) {
xqds.setProperty(pn_client_connectAttempts, value);
}
} catch (XQException ex) {
logger.error("", ex);
}
}
private static final ThreadLocal<TPoXQueryManagerTest> xqmt = new ThreadLocal<TPoXQueryManagerTest>() {
@Override
protected TPoXQueryManagerTest initialValue() {
try {
XQConnection xqc = xqds.getConnection();
SchemaRepository xdm = ((BagriXQDataFactory) xqc).getProcessor().getRepository();
TPoXQueryManagerTest xqmt = new TPoXQueryManagerTest(xdm);
logger.info("initialValue.exit; XDM: {}", xdm);
return xqmt;
} catch (XQException ex) {
logger.error("", ex);
return null;
}
}
};
public BagriDBPlugin() {
super();
}
@Override
public void close() throws SQLException {
//xdm.close();
TPoXQueryManagerTest test = xqmt.get();
logger.info("close; XDM: {}", test.getRepository());
try {
test.close();
} catch (Exception ex) {
logger.error("close.error; " + ex, ex);
throw new SQLException(ex);
}
}
@Override
public int execute() throws SQLException {
int transNo = wp.getNextTransNumToExecute(rand);
Transaction tx = wp.getTransaction(transNo);
int result = 0;
logger.trace("execute.enter; transaction: {}; ", tx.getTransName());
TPoXQueryManagerTest test = xqmt.get();
int err = 0;
try {
switch (tx.getTransName()) {
case "addDocument": {
ActualParamInfo param = wp.getParamMarkerActualValue(transNo, 0, rand);
String xml = new String(param.getDocument());
param = wp.getParamMarkerActualValue(transNo, 1, rand);
String prefix = param.getActualValue();
param = wp.getParamMarkerActualValue(transNo, 2, rand);
String uri = param.getActualValue();
uri = prefix + uri + ".xml";
if (test.storeDocument(uri, xml) != null) {
result = 1;
}
break;
}
case "getSecurity": {
ActualParamInfo param = wp.getParamMarkerActualValue(transNo, 0, rand);
String symbol = param.getActualValue();
Collection<String> sec = toCollection(test.getSecurity(symbol));
if (sec != null) {
result = sec.size();
}
break;
}
case "getSecurityPrice": {
ActualParamInfo param = wp.getParamMarkerActualValue(transNo, 0, rand);
String symbol = param.getActualValue();
Collection<String> sec = toCollection(test.getPrice(symbol));
if (sec != null) {
result = sec.size();
}
break;
}
case "searchSecurity": {
ActualParamInfo param = wp.getParamMarkerActualValue(transNo, 0, rand);
String sector = param.getActualValue();
param = wp.getParamMarkerActualValue(transNo, 1, rand);
float peMin = Float.valueOf(param.getActualValue());
param = wp.getParamMarkerActualValue(transNo, 2, rand);
float peMax = Float.valueOf(param.getActualValue());
param = wp.getParamMarkerActualValue(transNo, 3, rand);
float yieldMin = Float.valueOf(param.getActualValue());
Collection<String> sec = toCollection(test.searchSecurity(sector, peMin, peMax, yieldMin));
if (sec != null) {
result = sec.size();
}
break;
}
case "getOrder": {
ActualParamInfo param = wp.getParamMarkerActualValue(transNo, 0, rand);
String id = param.getActualValue();
Collection<String> sec = toCollection(test.getOrder(id));
if (sec != null) {
result = sec.size();
}
break;
}
case "getCustomerProfile": {
ActualParamInfo param = wp.getParamMarkerActualValue(transNo, 0, rand);
String id = param.getActualValue();
Collection<String> sec = toCollection(test.getCustomerProfile(id));
if (sec != null) {
result = sec.size();
}
break;
}
case "getCustomerAccounts": {
ActualParamInfo param = wp.getParamMarkerActualValue(transNo, 0, rand);
String id = param.getActualValue();
Collection<String> sec = toCollection(test.getCustomerAccounts(id));
if (sec != null) {
result = sec.size();
}
break;
}
default: {
logger.debug("execute; unknown command: {}", tx.getTransName());
}
}
} catch (Throwable ex) {
getLogger().error("execute.error", ex);
// just swallow it, in order to work further
err = 1;
}
DatabaseOperations.errors.get()[transNo] = err;
logger.trace("execute.exit; returning: {}", result);
return result;
}
@Override
protected int execCommand(String command, Map<String, Parameter> params) {
// TODO Auto-generated method stub
return 0;
}
@Override
protected int execQuery(String query, Map<String, Parameter> params) {
// TODO Auto-generated method stub
return 0;
}
@Override
protected Logger getLogger() {
return logger;
}
private Collection<String> toCollection(ResultCursor cursor) throws BagriException {
if (cursor == null) {
return null;
}
List<String> result = new ArrayList<>();
while (cursor.next()) {
result.add(cursor.getString());
}
return result;
}
private static class TPoXQueryManagerTest extends ClientQueryManagementTest {
TPoXQueryManagerTest(SchemaRepository xRepo) {
this.xRepo = xRepo;
}
void close() {
xRepo.close();
}
SchemaRepository getRepository() {
return xRepo;
}
Document storeDocument(String uri, String xml) throws Exception {
return xRepo.getDocumentManagement().storeDocumentFromString(uri, xml, null);
}
}
}