package com.activequant.dao.mybatis.mapper; import java.util.List; import org.apache.ibatis.annotations.CacheNamespace; import org.apache.ibatis.annotations.Delete; import org.apache.ibatis.annotations.Insert; import org.apache.ibatis.annotations.Options; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Result; import org.apache.ibatis.annotations.Results; import org.apache.ibatis.annotations.Select; import org.springframework.transaction.annotation.Transactional; import com.activequant.domainmodel.GenericRow; @CacheNamespace(size = 100000, flushInterval = (1000)) public interface GenericRowMapper { @Select("create table ${table} (created bigint not null, keyVal varchar(200) not null, fieldName varchar(200) not null, doubleVal double, longVal bigint, stringVal varchar(200))") void init(@Param("table") String table); @Select("CREATE INDEX i1 on ${table} (keyVal(255), fieldName(255))") void genIndex1(@Param("table") String table); @Select("CREATE INDEX i2 on ${table} (keyVal(255))") void genIndex2(@Param("table") String table); @Select("CREATE INDEX i3 on ${table} (keyVal, fieldName(255), doubleVal)") void genIndex3(@Param("table") String table); @Select("CREATE INDEX i4 on ${table} (keyVal, fieldName(255), stringVal(255))") void genIndex4(@Param("table") String table); @Select("CREATE INDEX i5 on ${table} (keyVal, fieldName(255), longVal)") void genIndex5(@Param("table") String table); @Select("CREATE INDEX i6 on ${table} (fieldName(255), longVal)") void genIndex6(@Param("table") String table); @Select("CREATE INDEX i7 on ${table} (fieldName(255), doubleVal)") void genIndex7(@Param("table") String table); @Select("CREATE INDEX i8 on ${table} (fieldName(255), stringVal)") void genIndex8(@Param("table") String table); @Select("ALTER TABLE ${table} ADD PRIMARY KEY (fieldName(255), keyVal(255))") void genKey9(@Param("table") String table); @Select("select * from ${table} where keyVal = #{keyValue} order by fieldName ASC") @Results({ @Result(property = "created", column = "created"), @Result(property = "keyVal", column = "keyVal"), @Result(property = "fieldName", column = "fieldName"), @Result(property = "doubleVal", column = "doubleVal"), @Result(property = "longVal", column = "longVal"), @Result(property = "stringVal", column = "stringVal") }) List<GenericRow> load(@Param("table") String table, @Param("keyValue") String keyValue); @Transactional @Insert("insert into ${table} values (#{row.created}, #{row.keyVal},#{row.fieldName},#{row.doubleVal},#{row.longVal},#{row.stringVal})") @Options(flushCache = true) void insert(@Param("table") String table, @Param("row") GenericRow row); @Select("SELECT distinct(keyVal) from ${table}") List<String> loadKeyList(@Param("table") String table); @Select("SELECT keyVal from ${table} where fieldName=#{fieldName} and stringVal=#{val}") List<String> findByString(@Param("table") String table, @Param("fieldName") String fieldName, @Param("val") String val); @Select("SELECT keyVal from ${table} where fieldName=#{fieldName} and longVal=#{val}") List<String> findByLong(@Param("table") String table, @Param("fieldName") String fieldName, @Param("val") Long val); @Select("SELECT keyVal from ${table} where fieldName=#{fieldName} and doubleVal=#{val}") List<String> findByDouble(@Param("table") String table, @Param("fieldName") String fieldName, @Param("val") Double val); @Delete("DELETE FROM ${table} where keyVal=#{keyVal}") @Options(flushCache = true) void delete(@Param("table") String table, @Param("keyVal") String keyVal); @Select("select distinct(A.keyVal) from ${table} A, ${table} B where (A.fieldName=#{fieldName1} and A.stringVal=#{val1}) and (B.fieldName=#{fieldName2} and B.stringVal = #{val2}) and A.keyVal = B.keyVal") List<String> findBy2StringVals(@Param("table") String table, @Param("fieldName1") String fieldName1, @Param("val1") String val1, @Param("fieldName2") String fieldName2, @Param("val2") String val2); @Select("SELECT keyVal from ${table} where fieldName=#{fieldName} and longVal>=#{val}") List<String> findIDsWhereLongValGreater(@Param("table") String table, @Param("fieldName") String fieldName, @Param("val") Long val); @Select("SELECT keyVal from ${table} where fieldName=#{fieldName} and longVal>=#{val} and longVal<=#{val2}") List<String> findIDsWhereLongValBetween(@Param("table") String table, @Param("fieldName") String fieldName, @Param("val") Long val, @Param("val2") Long val2); @Select("SELECT count(distinct(keyVal)) from ${table} where fieldName=#{fieldName} and stringVal=#{val}") int countForStringValue(@Param("table") String table, @Param("fieldName") String fieldName, @Param("val") String value); @Select("SELECT count(distinct(keyVal)) from ${table} where fieldName=#{fieldName} and longVal=#{val}") int countForLongValue(@Param("table") String table, @Param("fieldName") String fieldName, @Param("val") Long value); @Select("SELECT count(distinct(keyVal)) from ${table} where fieldName=#{fieldName} and doubleVal=#{val}") int countForDoubleValue(@Param("table") String table, @Param("fieldName") String fieldName, @Param("val") Double value); @Select("SELECT distinct(stringVal) from ${table} where fieldName=#{fieldName}") List<String> selectDistinctStringVal(@Param("table") String table, @Param("fieldName") String fieldName); @Select("SELECT distinct(longVal) from ${table} where fieldName=#{fieldName}") List<Long> selectDistinctLongVal(@Param("table") String table, @Param("fieldName") String fieldName); @Select("SELECT distinct(doubleVal) from ${table} where fieldName=#{fieldName}") List<Double> selectDistinctDoubleVal(@Param("table") String table, @Param("fieldName") String fieldName); @Select("SELECT count(distinct(keyVal)) from ${table}") int count(@Param("table") String table); @Select("SELECT keyVal from ${table} where fieldName='CLASSNAME' order by keyVal limit #{startIndex}, #{endIndex}") List<String> findIDs(@Param("table") String table, @Param("startIndex") int startIndex, @Param("endIndex") int endIndex); @Select("SELECT keyVal from ${table} where fieldName='CREATIONTIME' and longVal>#{startTime} and longVal<#{endTime} order by longVal asc") List<String> findIDsBetween(@Param("table") String table, @Param("startTime") long startTime, @Param("endTime") long endTime); @Select("SELECT distinct(keyVal) from ${table} where keyVal like #{id} order by keyVal limit #{amount} ") List<String> findIdsLike(@Param("table") String tableName, @Param("id") String idsLikeString, @Param("amount") int resultAmount); @Select("SELECT keyVal from ${table} where created<=#{timeStampInMs} and fieldName=#{parameter} and stringVal=#{val} order by created desc limit 1") String findLastIdBeforeCreationTime(@Param("table") String tableName, @Param("parameter") String parameter, @Param("val") String value, @Param("timeStampInMs") long timeStampInMs); @Select("SELECT keyVal from ${table} where created>=#{fromt} and created<=#{to} and fieldName=#{parameter} and stringVal=#{val} order by created desc") List<String> findIDsBetweenCreationTime(@Param("table") String tableName, @Param("parameter") String parameter, @Param("val") String value, @Param("fromt") long from, @Param("to") long to); @Transactional @Insert("replace into ${table} values (#{row.created}, #{row.keyVal},#{row.fieldName},#{row.doubleVal},#{row.longVal},#{row.stringVal})") @Options(flushCache = true) void update(@Param("table") String table, @Param("row") GenericRow row); }