--- /dev/null
+package user.jobengine.db;\r
+\r
+import java.sql.Connection;\r
+import java.sql.PreparedStatement;\r
+import java.sql.ResultSet;\r
+import java.sql.SQLException;\r
+import java.util.ArrayList;\r
+import java.util.Formatter;\r
+import java.util.List;\r
+import java.util.Locale;\r
+\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+\r
+import sqlj.runtime.ref.DefaultContext;\r
+\r
+public class MediaFinder {\r
+ private static final Logger logger = LogManager.getLogger();\r
+ private ItemManager manager = null;\r
+\r
+ public MediaFinder(ItemManager manager) {\r
+ this.manager = manager;\r
+ }\r
+\r
+ private String buildQueryCore(QueryObject parameter) {\r
+ QueryBuilder queryBuilder = new QueryBuilder();\r
+ queryBuilder.getParameters(parameter.getFilters());\r
+ return queryBuilder.getQuery();\r
+ }\r
+\r
+ private String buildResultQuery(QueryObject queryObject, String innerQuery, SearchResult csr) {\r
+ StringBuilder resultQuery = new StringBuilder();\r
+ Formatter qf = new Formatter(resultQuery, Locale.getDefault());\r
+ RenderParameter rp = queryObject.getParameters();\r
+ if (rp != null) {\r
+ long bottom = rp.getPage() * rp.getRowPerPage() + 1;\r
+ long top = bottom + rp.getRowPerPage() - 1;\r
+ resultQuery.append("WITH NUMBEREDITEM AS (");\r
+ Metadata orderMetadata = rp.getOrderBy();\r
+ if (queryObject.hasOrderInfo())\r
+ qf.format("SELECT ROWNUMBER() OVER (ORDER BY %1$s %2$s) AS RN, ", orderMetadata.getOrderName("i", "md"), rp.getOrderDirection().name());\r
+ else\r
+ resultQuery.append("SELECT ROWNUMBER() OVER () AS RN, ");\r
+ resultQuery.append("i.ID, i.TITLE, i.DESCRIPTION, i.ITEMTYPEID, i.HOUSEID, i.CREATED, i.ISFOLDER FROM ITEM i ");\r
+ String orderTableName = orderMetadata.getTableName();\r
+ if (orderTableName != null)\r
+ qf.format("LEFT OUTER JOIN %1$s md ON (md.ID = i.ID) ", orderTableName);\r
+ resultQuery.append("WHERE i.ID IN ");\r
+ qf.format("(SELECT ii.ID %1$s AND ii.ITEMTYPEID = %2$d))", innerQuery, csr.getItemType().getId());\r
+ qf.format(" SELECT * FROM NUMBEREDITEM WHERE RN BETWEEN %1$d AND %2$d", bottom, top);\r
+ } else {\r
+ resultQuery.append("SELECT i.ID, i.TITLE, i.DESCRIPTION, i.ITEMTYPEID, i.HOUSEID, i.CREATED, i.ISFOLDER FROM ITEM i ");\r
+ resultQuery.append("WHERE i.ID IN ");\r
+ qf.format("(SELECT ii.ID %1$s) ORDER BY i.TITLE", innerQuery);\r
+ }\r
+\r
+ logger.trace(resultQuery.toString());\r
+ return resultQuery.toString();\r
+ }\r
+\r
+ private PreparedStatement createArchiveMediaSearchStatement(Connection connection, String criteria, String orderBy, boolean orderAscending,\r
+ List<String> typeIDs) throws SQLException {\r
+ StringBuilder typeCriteria = new StringBuilder();\r
+ if (typeIDs != null) {\r
+ typeCriteria.append("(");\r
+ for (int i = 0; i < typeIDs.size(); i++) {\r
+ typeCriteria.append(typeIDs.get(i));\r
+ if (i < typeIDs.size() - 1)\r
+ typeCriteria.append(",");\r
+ }\r
+ typeCriteria.append(")");\r
+ }\r
+\r
+ StringBuilder sql = new StringBuilder();\r
+ sql.append("SELECT ");\r
+ sql.append(getColumnNames());\r
+ sql.append(\r
+ " FROM ITEM i, MEDIA m, MEDIAFILE mf, MEDIADESCRIPTION md, VW_MEDIAFILES vw_mf, ITEMTYPE it WHERE i.id = md.itemid AND m.id = md.mediaid AND mf.id = md.mediafileid AND m.id=vw_mf.mediaid AND m.itemTypeId = it.id");\r
+ if (typeIDs != null) {\r
+ sql.append(" AND m.itemtypeid IN ");\r
+ sql.append(typeCriteria.toString());\r
+ }\r
+\r
+ sql.append(" AND CONTAINS(md.description, ?) >= 1");\r
+ sql.append(" ORDER BY ");\r
+\r
+ if (orderBy == null) {\r
+ sql.append("itemtitle desc, mediaitemtypeid");\r
+ } else {\r
+ sql.append(orderBy);\r
+ sql.append(orderAscending ? " ASC" : " DESC");\r
+ }\r
+\r
+ String query = sql.toString();\r
+ logger.info(query);\r
+ PreparedStatement st = connection.prepareStatement(query, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);\r
+ st.setString(1, criteria);\r
+ return st;\r
+ }\r
+\r
+ private PreparedStatement createArchiveMediaSearchStatement1(Connection connection, String criteria, String orderBy, boolean orderAscending,\r
+ List<String> typeIDs) throws SQLException {\r
+ StringBuilder typeCriteria = new StringBuilder();\r
+ if (typeIDs != null) {\r
+ typeCriteria.append("(");\r
+ for (int i = 0; i < typeIDs.size(); i++) {\r
+ typeCriteria.append(typeIDs.get(i));\r
+ if (i < typeIDs.size() - 1)\r
+ typeCriteria.append(",");\r
+ }\r
+ typeCriteria.append(")");\r
+ }\r
+\r
+ String columNames = getColumnNames();\r
+ StringBuilder innerSql = new StringBuilder();\r
+ innerSql.append("SELECT DISTINCT ");\r
+ innerSql.append(columNames);\r
+ innerSql.append(" FROM ITEM i, MEDIA m, MEDIAFILE mf WHERE m.itemid = i.id AND mf.mediaid = m.id AND mf.storeid = 1");\r
+ if (typeIDs != null) {\r
+ innerSql.append(" AND m.itemtypeid IN ");\r
+ innerSql.append(typeCriteria.toString());\r
+ }\r
+\r
+ StringBuilder sql = new StringBuilder();\r
+ sql.append("SELECT * FROM ((");\r
+ sql.append(innerSql);\r
+ sql.append(" AND ((CONTAINS(i.title, ?) >= 1) OR (CONTAINS(i.description, ?) >= 1))");\r
+ sql.append(") UNION (");\r
+ sql.append(innerSql);\r
+ sql.append(" AND ((CONTAINS(m.title, ?) >= 1) OR (CONTAINS(m.description, ?) >= 1))");\r
+ sql.append(") UNION (");\r
+ sql.append(innerSql);\r
+ sql.append(" AND (CONTAINS(mf.houseId, ?) >= 1)");\r
+ sql.append(")) ORDER BY ");\r
+\r
+ if (orderBy == null) {\r
+ sql.append("itemtitle desc, mediaitemtypeid");\r
+ } else {\r
+ sql.append(orderBy);\r
+ sql.append(orderAscending ? " ASC" : " DESC");\r
+ }\r
+\r
+ String query = sql.toString();\r
+ logger.info(query);\r
+ PreparedStatement st = connection.prepareStatement(query, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);\r
+\r
+ for (int s = 1; s <= 5; s++) {\r
+ st.setString(s, criteria);\r
+ }\r
+ return st;\r
+ }\r
+\r
+ private String getColumnNames() {\r
+ StringBuilder columns = new StringBuilder();\r
+ columns.append("i.id itemid,");\r
+ columns.append("i.title itemtitle,");\r
+ columns.append("m.id mediaid,");\r
+ columns.append("m.title mediatitle,");\r
+ columns.append("m.archived,");\r
+ columns.append("m.length,");\r
+ columns.append("m.itemtypeid mediaitemtypeid,");\r
+ columns.append("it.name mediaitemtypename,");\r
+ columns.append("m.houseid mediahouseid,");\r
+ columns.append("mf.houseid mediafilehouseid,");\r
+ columns.append("vw_mf.mediafilecount");\r
+ return columns.toString();\r
+ }\r
+\r
+ private List<SearchResult> getResultHeaders(Connection connection, QueryObject queryObject, String innerQuery) {\r
+ List<SearchResult> results = new ArrayList<SearchResult>();\r
+ String typeQuery;\r
+ if (queryObject.getParameters() == null)\r
+ typeQuery = String.format("SELECT CAST(COUNT(DISTINCT(ii.ID)) AS BIGINT) %s", innerQuery);\r
+ else\r
+ typeQuery = String.format("SELECT ii.ITEMTYPEID, CAST(COUNT(DISTINCT(ii.ID)) AS BIGINT) %s GROUP BY ii.ITEMTYPEID", innerQuery);\r
+\r
+ logger.trace(typeQuery.toString());\r
+ PreparedStatement st = null;\r
+ ResultSet rs = null;\r
+ try {\r
+ st = connection.prepareStatement(typeQuery);\r
+ rs = st.executeQuery();\r
+ while (rs.next()) {\r
+ SearchResult sr = new SearchResult();\r
+ if (queryObject.getParameters() == null) {\r
+ sr.setItemCount(rs.getLong(1));\r
+ } else {\r
+ ItemType itemType = (ItemType) manager.get(ItemType.class, rs.getLong(1));\r
+ sr.setItemType(itemType);\r
+ sr.setItemCount(rs.getLong(2));\r
+ }\r
+\r
+ sr.setParameters(queryObject.getParameters());\r
+ results.add(sr);\r
+ }\r
+ } catch (Exception e) {\r
+ logger.catching(e);\r
+ } finally {\r
+ try {\r
+ if (rs != null)\r
+ rs.close();\r
+ } catch (Exception e1) {\r
+ e1.printStackTrace();\r
+ }\r
+ try {\r
+ if (st != null)\r
+ st.close();\r
+ } catch (Exception e1) {\r
+ e1.printStackTrace();\r
+ }\r
+ }\r
+ return results;\r
+ }\r
+\r
+ private List<String> getTypeIDs(List<String> searchFilters) {\r
+ List<String> result = null;\r
+ if (searchFilters != null) {\r
+ for (String typeName : searchFilters) {\r
+ ItemType itemType = manager.getItemType(typeName);\r
+ if (itemType == null)\r
+ continue;\r
+ if (result == null)\r
+ result = new ArrayList<>();\r
+ result.add(String.valueOf(itemType.getId()));\r
+ }\r
+ }\r
+ return result;\r
+ }\r
+\r
+ public List<Media> getUntranscodedMedias() {\r
+ List<Media> result = null;\r
+\r
+ ResultSet rs = null;\r
+ PreparedStatement st = null;\r
+ DefaultContext context = manager.getDbContext();\r
+ Connection connection = context.getConnection();\r
+ try {\r
+\r
+ String query = "select m.ID, m.TITLE, m.DESCRIPTION, m.ITEMID, m.ITEMTYPEID, m.HOUSEID, m.LENGTH, m.CREATED, m.ARCHIVED, m.POSTER from MEDIA m right outer join VW_MEDIAFILES f on (f.MEDIAID = m.ID) where m.CREATED > '2017-12-14' and f.MEDIAFILECOUNT = 1";\r
+ st = connection.prepareStatement(query);\r
+ rs = st.executeQuery();\r
+\r
+ while (rs.next()) {\r
+ Media m = new Media();\r
+ m.setPersister(manager);\r
+ m.setId(rs.getLong("id"));\r
+ m.setTitle(rs.getString("title"));\r
+ m.setDescription(rs.getString("description"));\r
+ m.setItemId(rs.getLong("itemid"));\r
+ m.setItemTypeId(rs.getLong("itemtypeid"));\r
+ m.setHouseId(rs.getString("houseid"));\r
+ m.setLength(rs.getLong("length"));\r
+ m.setCreated(rs.getTimestamp("created"));\r
+ m.setArchived(rs.getTimestamp("archived"));\r
+ m.setPoster(rs.getBytes("poster"));\r
+ if (result == null)\r
+ result = new ArrayList<>();\r
+ result.add(m);\r
+ }\r
+\r
+ connection.commit();\r
+ } catch (Exception e) {\r
+ try {\r
+ connection.rollback();\r
+ } catch (Exception e1) {\r
+ }\r
+ manager.throwError(e);\r
+ } finally {\r
+ try {\r
+ if (rs != null)\r
+ rs.close();\r
+ } catch (Exception e1) {\r
+ }\r
+ try {\r
+ if (st != null)\r
+ st.close();\r
+ } catch (Exception e1) {\r
+ }\r
+ manager.putDbContext(context);\r
+ }\r
+\r
+ return result;\r
+ }\r
+\r
+ @SuppressWarnings("unchecked")\r
+ public List<SearchResult> search(QueryObject queryObject) {\r
+ manager.traceIn();\r
+ if (queryObject == null || queryObject.getFilters() == null || queryObject.getFilters().size() == 0)\r
+ throw new IllegalArgumentException("QueryObject not specified.");\r
+\r
+ List<SearchResult> results = new ArrayList<SearchResult>();\r
+\r
+ ResultSet rs = null;\r
+ PreparedStatement st = null;\r
+ DefaultContext context = manager.getDbContext();\r
+ Connection connection = context.getConnection();\r
+\r
+ try {\r
+ String innerQuery = buildQueryCore(queryObject);\r
+\r
+ if (queryObject.getActiveItemTypeId() == 0) {\r
+ // keres�s az �sszes t�pusban\r
+ // Ha nincs RenderParameter, akkor az eredm�ny egy\r
+ // SearchResult-ba ker�l, egy�bk�nt\r
+ // ItemType-onk�nt t�bbe\r
+ results = getResultHeaders(connection, queryObject, innerQuery);\r
+ } else {\r
+ SearchResult sr = new SearchResult();\r
+ ItemType itemType = (ItemType) manager.get(ItemType.class, queryObject.getActiveItemTypeId());\r
+ sr.setItemType(itemType);\r
+ // TODO\r
+ // sr.setItemCount(rs.getLong(2));\r
+ sr.setParameters(queryObject.getParameters());\r
+ results.add(sr);\r
+ }\r
+\r
+ if (results.size() != 0) {\r
+ SearchResult csr = results.get(0);\r
+ String resultQuery = buildResultQuery(queryObject, innerQuery, csr);\r
+ st = connection.prepareStatement(resultQuery);\r
+\r
+ // int rpp = (int)parameter.getParameters().getRowPerPage();\r
+ // st.setFetchSize(rpp);\r
+ // st.setMaxRows(rpp);\r
+\r
+ rs = st.executeQuery();\r
+ List<Item> items = new ArrayList<Item>();\r
+ ItemDAO dao = (ItemDAO) manager.getBaseDAO(Item.class);\r
+ items = (List<Item>) (List<?>) dao.entities(context, rs);\r
+ csr.setItems(items);\r
+ rs.close();\r
+ }\r
+\r
+ connection.commit();\r
+ } catch (Exception e) {\r
+ try {\r
+ connection.rollback();\r
+ } catch (Exception e1) {\r
+ e1.printStackTrace();\r
+ }\r
+ manager.throwError(e);\r
+ } finally {\r
+ try {\r
+ if (rs != null)\r
+ rs.close();\r
+ } catch (Exception e1) {\r
+ }\r
+ try {\r
+ if (st != null)\r
+ st.close();\r
+ } catch (Exception e1) {\r
+ }\r
+ manager.putDbContext(context);\r
+ }\r
+ manager.traceOut();\r
+ return results;\r
+ }\r
+\r
+ public SearchResult<Item> search(String criteria, int fromResult, int toResult) {\r
+ SearchResult<Item> result = new SearchResult<Item>();\r
+\r
+ ResultSet rs = null;\r
+ PreparedStatement st = null;\r
+ DefaultContext context = manager.getDbContext();\r
+ Connection connection = context.getConnection();\r
+\r
+ try {\r
+ StringBuffer sql = new StringBuffer();\r
+ sql.append("select * from ((");\r
+ sql.append("select distinct i.id,i.itemtypeid,i.houseid,i.title,i.description,i.isfolder,i.created,i.modified from item i, media m, mediafile mf");\r
+ sql.append(\r
+ " where ((CONTAINS(i.title, ?) >= 1) OR (CONTAINS(i.description, ?) >= 1) OR (CONTAINS(i.houseId, ?) >= 1)) and m.itemid = i.id and mf.MEDIAID = m.id");\r
+ sql.append(")UNION(");\r
+ sql.append(\r
+ "select distinct i2.id,i2.itemtypeid,i2.houseid,i2.title,i2.description,i2.isfolder,i2.created,i2.modified from item i2, media m2, mediafile mf2");\r
+ sql.append(\r
+ " where ((CONTAINS(m2.title, ?) >= 1) OR (CONTAINS(m2.description, ?) >= 1) OR (CONTAINS(m2.houseId, ?) >= 1)) and m2.itemid = i2.id and mf2.MEDIAID = m2.id");\r
+ sql.append(")UNION(");\r
+ sql.append(\r
+ "select distinct i3.id,i3.itemtypeid,i3.houseid,i3.title,i3.description,i3.isfolder,i3.created,i3.modified from item i3, media m3, mediafile mf3");\r
+ sql.append(" where (CONTAINS(mf3.houseId, ?) >= 1) and m3.itemid = i3.id and mf3.MEDIAID = m3.id");\r
+ sql.append(")) order by title");\r
+ String query = sql.toString();\r
+ /*\r
+ query = "SELECT i.* from item i, media m, mediafile mf WHERE m.ITEMID = i.id AND mf.MEDIAID = m.ID"\r
+ + " AND (" + "(CONTAINS(i.TITLE, '" + criteria + "') >= 1) OR (CONTAINS(i.DESCRIPTION, '" + criteria\r
+ + "') >= 1)" + " OR (CONTAINS(m.TITLE, '" + criteria + "') >= 1) OR (CONTAINS(m.DESCRIPTION, '"\r
+ + criteria + "') >= 1)" + " OR (CONTAINS(mf.HOUSEID, '" + criteria\r
+ + "') >= 1)) ORDER BY i.title";\r
+ */\r
+ // query = "SELECT * FROM ITEM ORDER BY title";\r
+\r
+ st = connection.prepareStatement(query, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);\r
+ for (int s = 1; s <= 7; s++) {\r
+ st.setString(s, criteria);\r
+ }\r
+ rs = st.executeQuery();\r
+ rs.last();\r
+ result.setItemCount(rs.getRow());\r
+\r
+ // set begining position\r
+ if (fromResult > -1) {\r
+ if (fromResult <= result.getItemCount()) {\r
+ if (fromResult > 1) {\r
+ rs.absolute(fromResult - 1);\r
+ } else {\r
+ rs.beforeFirst();\r
+ }\r
+ } else {\r
+ if (result.getItemCount() > 0) {\r
+ throw new Exception("Invalid searchResult 'from' position: " + fromResult + " total records: " + result.getItemCount() + " " + query);\r
+ }\r
+ }\r
+ } else {\r
+ rs.beforeFirst();\r
+ }\r
+\r
+ int maxRecords = toResult - fromResult;\r
+\r
+ ItemDAO dao = (ItemDAO) manager.getBaseDAO(Item.class);\r
+ result.setItems((List<Item>) (List<?>) dao.entities(context, rs, maxRecords));\r
+\r
+ connection.commit();\r
+ } catch (Exception e) {\r
+ try {\r
+ connection.rollback();\r
+ } catch (Exception e1) {\r
+ e1.printStackTrace();\r
+ }\r
+ manager.throwError(e);\r
+ } finally {\r
+ try {\r
+ if (rs != null)\r
+ rs.close();\r
+ } catch (Exception e1) {\r
+ }\r
+ try {\r
+ if (st != null)\r
+ st.close();\r
+ } catch (Exception e1) {\r
+ }\r
+ manager.putDbContext(context);\r
+ }\r
+ manager.traceOut();\r
+\r
+ return result;\r
+ }\r
+\r
+ public SearchResult<ArchivedMedia> searchArchivedMedia(String criteria, List<String> searchFilters, String orderBy, boolean orderAscending, int fromResult,\r
+ int toResult) {\r
+ SearchResult<ArchivedMedia> result = new SearchResult<>();\r
+\r
+ List<String> typeIDs = getTypeIDs(searchFilters);\r
+\r
+ ResultSet rs = null;\r
+ PreparedStatement st = null;\r
+ DefaultContext context = manager.getDbContext();\r
+ Connection connection = context.getConnection();\r
+ try {\r
+\r
+ st = createArchiveMediaSearchStatement(connection, criteria, orderBy, orderAscending, typeIDs);\r
+ rs = st.executeQuery();\r
+ rs.last();\r
+ result.setItemCount(rs.getRow());\r
+\r
+ // set begining position\r
+ if (fromResult > -1) {\r
+ if (fromResult <= result.getItemCount()) {\r
+ if (fromResult > 1) {\r
+ rs.absolute(fromResult - 1);\r
+ } else {\r
+ rs.beforeFirst();\r
+ }\r
+ } else {\r
+ if (result.getItemCount() > 0) {\r
+ throw new Exception("Invalid searchResult 'from' position: " + fromResult + " total records: " + result.getItemCount());\r
+ }\r
+ }\r
+ } else {\r
+ rs.beforeFirst();\r
+ }\r
+\r
+ int maxRecords = toResult - fromResult;\r
+\r
+ String[] criterias = criteria.replace("*", "").replace("+", " ").split(" ");\r
+ if (criteria.startsWith("\"") && criteria.endsWith("\""))\r
+ criterias = new String[] { criteria.replace("\"", "") };\r
+ List<ArchivedMedia> resultList = null;\r
+ logger.info("Processing query result, maxRecords {}", maxRecords);\r
+\r
+ while (rs.next() && maxRecords > 0) {\r
+ ArchivedMedia am = new ArchivedMedia();\r
+ Media media = manager.getMedia(rs.getLong("mediaid"));\r
+ am.setMedia(media);\r
+ Item item = manager.getItem(media.getItemId());\r
+ am.setItem(item);\r
+\r
+ if (resultList == null)\r
+ resultList = new ArrayList<>();\r
+ resultList.add(am);\r
+\r
+ setRelevant(criterias, am, media.getDescription());\r
+ if (am.getRelevant() == null)\r
+ setRelevant(criterias, am, item.getDescription());\r
+\r
+ // media.setTitle(media.getTitle().replace("hirado", "<html><![CDATA[]]></html>"));\r
+ maxRecords--;\r
+ }\r
+ logger.info("Query result processed");\r
+ result.setItems(resultList);\r
+ connection.commit();\r
+ } catch (Exception e) {\r
+ try {\r
+ connection.rollback();\r
+ } catch (Exception e1) {\r
+ e1.printStackTrace();\r
+ }\r
+ manager.throwError(e);\r
+ } finally {\r
+ try {\r
+ if (rs != null)\r
+ rs.close();\r
+ } catch (Exception e1) {\r
+ }\r
+ try {\r
+ if (st != null)\r
+ st.close();\r
+ } catch (Exception e1) {\r
+ }\r
+ manager.putDbContext(context);\r
+ }\r
+ manager.traceOut();\r
+\r
+ return result;\r
+ }\r
+\r
+ private void setRelevant(String[] criterias, ArchivedMedia am, String content) {\r
+ if (content == null)\r
+ return;\r
+ for (String c : criterias) {\r
+ if (c != null && c.length() > 2) {\r
+\r
+ int pos = content.toLowerCase().indexOf(c.toLowerCase());\r
+ if (pos > -1) {\r
+ int start = 0;\r
+ if (pos > 100)\r
+ start = pos - 100;\r
+ else\r
+ start = 0;\r
+ int end = pos + 200;\r
+ if (end > content.length() - 1)\r
+ end = content.length() - 1;\r
+\r
+ String relevant = content.substring(start, pos) + "<span class='rhl'>" + content.substring(pos, pos + c.length()) + "</span>"\r
+ + content.substring(pos + c.length(), end);\r
+\r
+ if (start > 0)\r
+ relevant = "..." + relevant;\r
+ if (end < content.length() - 1)\r
+ relevant = relevant + "...";\r
+\r
+ am.setRelevant(relevant);\r
+ break;\r
+ }\r
+\r
+ }\r
+ }\r
+ }\r
+}\r