/***************************************************
*
* cismet GmbH, Saarbruecken, Germany
*
* ... and it just works.
*
****************************************************/
/*
* QueryCache.java
*
* Created on 22. November 2003, 11:06
*/
package Sirius.server.localserver.query;
import Sirius.server.search.*;
import Sirius.server.search.searchparameter.*;
import Sirius.server.sql.*;
import java.sql.*;
import java.util.*;
/**
* DOCUMENT ME!
*
* @author schlob
* @version $Revision$, $Date$
*/
public class QueryCache {
//~ Instance fields --------------------------------------------------------
String domain;
HashMap queries;
// querie + permission Hashsets
HashMap searchOptions;
Connection con;
PreparedStatement maxQueryId;
PreparedStatement maxParameterId;
private final transient org.apache.log4j.Logger logger = org.apache.log4j.Logger.getLogger(this.getClass());
//~ Constructors -----------------------------------------------------------
/**
* Creates a new QueryCache object.
*
* @param dbcon DOCUMENT ME!
* @param domain DOCUMENT ME!
*/
public QueryCache(final DBConnection dbcon, final String domain) {
this(dbcon.getConnection(), dbcon.getStatementCache(), domain);
}
/**
* Creates a new instance of QueryCache.
*
* @param con DOCUMENT ME!
* @param cache DOCUMENT ME!
* @param domain DOCUMENT ME!
*/
public QueryCache(final Connection con, final StatementCache cache, final String domain) {
this.con = con;
queries = new HashMap(cache.size());
// to large but doesn't matter
searchOptions = new HashMap(cache.size());
final Collection qs = cache.values();
final Iterator iter = qs.iterator();
while (iter.hasNext()) {
final Query q = new Query((SystemStatement)iter.next(), domain);
queries.put(q.getKey(), q);
if (logger.isDebugEnabled()) {
logger.debug("query added " + q); // NOI18N
}
if (q.isRoot() && q.isSearch()) {
searchOptions.put(q.getKey(), new SearchOption(q));
if (logger.isDebugEnabled()) {
logger.debug("query added " + q + " ROOT"); // NOI18N
}
}
// if(logger.isDebugEnabled())
// logger.debug("searchOptions constructed :: "+new Vector(searchOptions.values()));
}
this.domain = domain;
setSearchParameters(domain);
// build Query Graph
linkIt(domain);
// add class permissions to search options
setClassPermissions(domain);
// add ug permissions to search options
setUserGroupPermissions(domain);
try {
maxQueryId = con.prepareStatement("select max(id) from cs_query"); // NOI18N
maxParameterId = con.prepareStatement("select max(id) from cs_query_parameter"); // NOI18N
} catch (SQLException e) {
ExceptionHandler.handle(e);
}
}
////////////////////////////////////////////////////////////////
//~ Methods ----------------------------------------------------------------
/**
* DOCUMENT ME!
*
* @param domain DOCUMENT ME!
*/
private void setClassPermissions(final String domain) {
// verkn\u00FCpfung der Queries
try {
final Statement getQueryClassAssoc = con.createStatement();
final ResultSet rs = getQueryClassAssoc.executeQuery("SELECT * from cs_query_class_assoc"); // NOI18N
int q_id = 0;
int c_id = 0;
while (rs.next()) {
q_id = rs.getInt("query_id"); // NOI18N
c_id = rs.getInt("class_id"); // NOI18N
final Object option = searchOptions.get(q_id + "@" + domain); // NOI18N
if (option != null) {
((SearchOption)option).addClass(c_id + "@" + domain); // NOI18N
}
}
} catch (Exception e) {
ExceptionHandler.handle(e);
}
}
////////////////////////////////////////////////////////////////
/**
* DOCUMENT ME!
*
* @param domain DOCUMENT ME!
*/
private void setUserGroupPermissions(final String domain) {
// verkn\u00FCpfung der Queries
try {
final Statement getQueryClassAssoc = con.createStatement();
final ResultSet rs = getQueryClassAssoc.executeQuery(
"SELECT d.name,query_id,ug_id from cs_query_ug_assoc as uga ,cs_domain as d , cs_ug as ug where uga.ug_id=ug.id and d.id=ug.domain"); // NOI18N
// Vorsicht die Id ist nicht Systemweit eindeutig statt ug_id muss ug_name verwendet werden
// dazu suche wo werden query permissions abgefragt
// checken wie der Abfrageschl\u00FCssel gebaut wird
int q_id = 0;
int ug_id = 0;
String ug_domain = ""; // NOI18N
while (rs.next()) {
ug_domain = rs.getString("name"); // NOI18N
if (ug_domain == null) {
;
}
ug_domain = domain;
q_id = rs.getInt("query_id"); // NOI18N
ug_id = rs.getInt("ug_id"); // NOI18N
final Object option = searchOptions.get(q_id + "@" + domain); // NOI18N
if (option != null) {
((SearchOption)option).addUserGroup(ug_id + "@" + ug_domain); // NOI18N
}
}
} catch (Exception e) {
ExceptionHandler.handle(e);
}
}
////////////////////////////////////////////////////////////////
/**
* DOCUMENT ME!
*
* @param domain DOCUMENT ME!
*/
private void linkIt(final String domain) {
// verkn\u00FCpfung der Queries
try {
final Statement getLinks = con.createStatement();
final ResultSet rs = getLinks.executeQuery(
"SELECT id_from,id_to,d.name as domain_to,qfrom.name as fromName,qto.name as toName from cs_query_link as l,cs_query as qfrom,cs_query as qto,cs_domain as d where l.id_from = qfrom.id and l.id_to=qto.id and d.id=l.domain_to"); // NOI18N
int from = 0;
int to = 0;
String nameFrom = ""; // NOI18N
String nameTo = ""; // NOI18N
while (rs.next()) {
String domainTo = null;
Query q = null;
from = rs.getInt("id_from"); // NOI18N
to = rs.getInt("id_to"); // NOI18N
domainTo = rs.getString("domain_to"); // NOI18N
nameFrom = rs.getString("fromName"); // NOI18N
nameTo = rs.getString("toName"); // NOI18N
final String qKey = from + "@" + domain; // NOI18N
// xxx ls_name
q = (Query)queries.get(nameFrom + "@" + domain); // NOI18N
if (logger.isDebugEnabled()) {
logger.debug("query linked" + q); // NOI18N
}
Query subQ = null;
// keine Queryreferenzierung auf einen anderen Server
if ((domainTo == null) || domainTo.equals("LOCAL")) { // NOI18N
// subQ=(Query)queries.get(to+"@"+domain);
subQ = (Query)queries.get(nameTo + "@" + domain); // NOI18N
q.addSubQuery(subQ);
} else // add QueryRumpf (referenziert anderen ls
{
// vorsicht die Parameter fehlen
// daher setzte parameter der superQuery
final Query father = (Query)queries.get(nameFrom + "@" + this.domain); // NOI18N
subQ = new Query(new QueryIdentifier(domainTo, to));
subQ.setParameters(father.getParameters());
q.addSubQuery(subQ);
}
if (logger.isDebugEnabled()) {
logger.debug("Subquery :: " + subQ); // NOI18N
}
}
} catch (Exception e) {
ExceptionHandler.handle(e);
}
}
/////////////////////////////////////////////////////////////////////////
/**
* DOCUMENT ME!
*
* @param domain DOCUMENT ME!
*/
private void setSearchParameters(final String domain) {
try {
final Statement getSearchParameter = con.createStatement();
final ResultSet rs = getSearchParameter.executeQuery(
"SELECT qp.id as p_id,q.id as q_id,qp.param_key as p_key,qp.is_query_result as is_result,qp.query_position as pos,q.name as query_name, qp.descr as query_description from cs_query_parameter as qp,cs_query as q where q.id=qp.query_id"); // NOI18N
int id = 0;
int q_id = 0;
boolean isQueryResult = false;
int pos = 0;
String queryKey = ""; // NOI18N
String queryDescription = ""; // NOI18N
while (rs.next()) {
String key = null;
id = rs.getInt("p_id"); // NOI18N
q_id = rs.getInt("q_id"); // NOI18N
key = rs.getString("p_key").trim(); // NOI18N
isQueryResult = rs.getBoolean("is_result"); // NOI18N
pos = rs.getInt("pos"); // NOI18N
queryKey = rs.getString("query_name").trim(); // NOI18N
queryDescription = rs.getString("query_description"); // NOI18N
final Query q = (Query)queries.get(queryKey + "@" + domain); // NOI18N
if (q != null) {
q.addParameter(new DefaultSearchParameter(key, null, isQueryResult, pos, queryDescription));
}
}
} catch (Exception e) {
logger.error("search will not work queryparameters could not be set", e); // NOI18N
ExceptionHandler.handle(e);
}
}
/**
* /////////////////////////////////////////////////////////////////
*
* @param qid DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public Query getQuery(final QueryIdentifier qid) {
return (Query)queries.get(qid);
}
/**
* ///////////////////////////////////////////////////////////////
*
* @param qid DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public SearchOption getSearchOption(final QueryIdentifier qid) {
return (SearchOption)searchOptions.get(qid);
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public HashMap getSearchOptions() {
return searchOptions;
}
/**
* DOCUMENT ME!
*
* @param name DOCUMENT ME!
* @param description DOCUMENT ME!
* @param statement DOCUMENT ME!
* @param resultType DOCUMENT ME!
* @param isUpdate DOCUMENT ME!
* @param isBatch DOCUMENT ME!
* @param isRoot DOCUMENT ME!
* @param isUnion DOCUMENT ME!
*
* @return DOCUMENT ME!
*
* @throws Exception DOCUMENT ME!
*/
public int addQuery(final String name,
final String description,
final String statement,
final int resultType,
final char isUpdate,
final char isBatch,
final char isRoot,
final char isUnion) throws Exception {
final Statement s = con.createStatement();
int maxId = 0;
final ResultSet max = maxQueryId.executeQuery();
if (max.next()) {
maxId = max.getInt(1) + 1;
}
final String stmnt = "insert into cs_query values(" + maxId + ",'" + name + "','" + description
+ "','" // NOI18N
+ statement
+ "'," + resultType + ",'" + isUpdate + "','" + isBatch + "','" + isRoot + "','" + isUnion // NOI18N
+ "', false,true )"; // NOI18N
final Statement insert = con.createStatement();
if (logger.isDebugEnabled()) {
logger.debug("add query info :" + stmnt); // NOI18N
}
if (insert.executeUpdate(stmnt) > 0) {
return maxId;
} else {
return -1;
}
}
/**
* DOCUMENT ME!
*
* @param name DOCUMENT ME!
* @param description DOCUMENT ME!
* @param statement DOCUMENT ME!
*
* @return DOCUMENT ME!
*
* @throws Exception DOCUMENT ME!
*/
public int addQuery(final String name, final String description, final String statement) throws Exception {
return addQuery(name, description, statement, 0, 'F', 'F', 'T', 'F');
}
/**
* DOCUMENT ME!
*
* @param queryId DOCUMENT ME!
* @param typeId DOCUMENT ME!
* @param paramKey DOCUMENT ME!
* @param description DOCUMENT ME!
* @param isQueryResult DOCUMENT ME!
* @param queryPosition DOCUMENT ME!
*
* @return DOCUMENT ME!
*
* @throws Exception DOCUMENT ME!
*/
public boolean addQueryParameter(final int queryId,
final int typeId,
final String paramKey,
final String description,
final char isQueryResult,
final int queryPosition) throws Exception {
final Statement s = con.createStatement();
int maxId = 0;
final ResultSet max = maxParameterId.executeQuery();
if (max.next()) {
maxId = max.getInt(1) + 1;
}
final String stmnt = "insert into cs_query_parameter values(" + maxId + "," + queryId + ",'" + paramKey
+ "','" // NOI18N
+ description + "','" + isQueryResult + "'," + typeId + "," + queryPosition + ")"; // NOI18N
if (logger.isDebugEnabled()) {
logger.debug("add queryparam info :" + stmnt); // NOI18N
}
final Statement insert = con.createStatement();
return insert.executeUpdate(stmnt) > 0;
}
/**
* position set in order of the addition.
*
* @param queryId DOCUMENT ME!
* @param paramkey DOCUMENT ME!
* @param description DOCUMENT ME!
*
* @return DOCUMENT ME!
*
* @throws Exception DOCUMENT ME!
*/
public boolean addQueryParameter(final int queryId, final String paramkey, final String description)
throws Exception {
return addQueryParameter(queryId, 0, paramkey, description, 'F', 0);
}
}