package rocks.inspectit.shared.cs.indexing.indexer.impl;
import rocks.inspectit.shared.all.communication.DefaultData;
import rocks.inspectit.shared.all.communication.data.SqlStatementData;
import rocks.inspectit.shared.all.indexing.IIndexQuery;
import rocks.inspectit.shared.cs.indexing.indexer.AbstractSharedInstanceBranchIndexer;
import rocks.inspectit.shared.cs.indexing.indexer.IBranchIndexer;
import rocks.inspectit.shared.cs.indexing.storage.impl.StorageIndexQuery;
/**
* Indexer that indexes SQLs based on the query string. All other objects types are indexed with
* same key.
*
* @author Ivan Senic
*
* @param <E>
*/
public class SqlStringIndexer<E extends DefaultData> extends AbstractSharedInstanceBranchIndexer<E> implements IBranchIndexer<E> {
/**
* Maximum amount of branches/leaf that can be created by this indexer. Negative values means no
* limit.
*/
private final int maxKeys;
/**
* Default constructor. Adds no limit on the maximum amount of keys created.
*/
public SqlStringIndexer() {
this(-1);
}
/**
* Additional constructor. Sets the amount of maximum keys that will be created. If unlimited
* keys should be used, construct object with no-arg constructor or pass the non-positive
* number.
*
* @param maxKeys
* Max keys that can be created by this indexer.
*/
public SqlStringIndexer(int maxKeys) {
this.maxKeys = maxKeys;
}
/**
* {@inheritDoc}
*/
@Override
public Object getKey(E element) {
if (element instanceof SqlStatementData) {
SqlStatementData sqlStatementData = (SqlStatementData) element;
if (null != sqlStatementData.getSql()) {
return getInternalHash(sqlStatementData.getSql().hashCode());
}
}
return 0;
}
/**
* {@inheritDoc}
*/
@Override
public Object[] getKeys(IIndexQuery query) {
if (query instanceof StorageIndexQuery) {
if (null != ((StorageIndexQuery) query).getSql()) {
Object[] keys = new Object[1];
keys[0] = getInternalHash(((StorageIndexQuery) query).getSql().hashCode());
return keys;
}
}
return new Object[0];
}
/**
* Internal hash function depending on the {@link #maxKeys}.
*
* @param hashCode
* Hash code to transform.
* @return Key that can be used.
*/
private Integer getInternalHash(int hashCode) {
if (maxKeys > 0) {
return Integer.valueOf(Math.abs(hashCode % maxKeys));
} else {
return hashCode;
}
}
}