DB modositasok, kereses merese
authorelgekko <vasary@elgekko.net>
Thu, 9 Mar 2023 09:29:24 +0000 (10:29 +0100)
committerelgekko <vasary@elgekko.net>
Thu, 9 Mar 2023 09:29:24 +0000 (10:29 +0100)
server/user.jobengine.osgi.db/migrations/scripts/041_alter_media_description.sql [new file with mode: 0644]
server/user.jobengine.osgi.db/migrations/scripts/042_create_function_TSMStoreId.sql [new file with mode: 0644]
server/user.jobengine.osgi.db/migrations/scripts/043_add_filecount_to_media.sql [new file with mode: 0644]
server/user.jobengine.osgi.db/src/user/jobengine/search/IExecutionDurationNotification.java [new file with mode: 0644]
server/user.jobengine.osgi.db/src/user/jobengine/search/SearchSQL.java [new file with mode: 0644]

diff --git a/server/user.jobengine.osgi.db/migrations/scripts/041_alter_media_description.sql b/server/user.jobengine.osgi.db/migrations/scripts/041_alter_media_description.sql
new file mode 100644 (file)
index 0000000..f14a4f6
--- /dev/null
@@ -0,0 +1,14 @@
+-- // Extends MEDIA DESCRIPTION from VARCHAR to CLOB\r
+-- Migration SQL that makes the change goes here.\r
+\r
+ALTER TABLE MEDIA\r
+ ALTER COLUMN DESCRIPTION\r
+ SET DATA TYPE CLOB\r
+@\r
+\r
+-- //@UNDO\r
+-- SQL to undo the change goes here.\r
+ALTER TABLE MEDIA\r
+ ALTER COLUMN DESCRIPTION\r
+ SET DATA TYPE VARCHAR(32000)\r
+@\r
diff --git a/server/user.jobengine.osgi.db/migrations/scripts/042_create_function_TSMStoreId.sql b/server/user.jobengine.osgi.db/migrations/scripts/042_create_function_TSMStoreId.sql
new file mode 100644 (file)
index 0000000..9d7f40f
--- /dev/null
@@ -0,0 +1,13 @@
+-- // Extends MEDIA DESCRIPTION from VARCHAR to CLOB\r
+-- Migration SQL that makes the change goes here.\r
+\r
+CREATE FUNCTION TSMStoreId()\r
+RETURNS BIGINT\r
+RETURN\r
+       SELECT id FROM STORE WHERE NAME='TSM'\r
+@\r
+\r
+-- //@UNDO\r
+-- SQL to undo the change goes here.\r
+DROP FUNCTION TSMStoreId\r
+@\r
diff --git a/server/user.jobengine.osgi.db/migrations/scripts/043_add_filecount_to_media.sql b/server/user.jobengine.osgi.db/migrations/scripts/043_add_filecount_to_media.sql
new file mode 100644 (file)
index 0000000..a4e2ec6
--- /dev/null
@@ -0,0 +1,38 @@
+-- // Create and fill FILECOUNT in MEDIA\r
+DROP TRIGGER TRG_MEDIA_AFTER_UPDATE \r
+@\r
+\r
+ALTER TABLE MEDIA ADD COLUMN FILECOUNT INT\r
+@\r
+\r
+UPDATE MEDIA m \r
+SET    m.FILECOUNT = ( \r
+       SELECT f.MEDIAFILECOUNT FROM FILECOUNTS f WHERE f.MEDIAID = m.ID\r
+) WHERE EXISTS (\r
+       SELECT 1 FROM FILECOUNTS f WHERE f.MEDIAID = m.ID\r
+)\r
+@\r
+\r
+CREATE INDEX IDX_MEDIA_FILECOUNT ON MEDIA (FILECOUNT)\r
+@\r
+\r
+CREATE OR REPLACE TRIGGER TRG_MEDIA_AFTER_UPDATE \r
+AFTER UPDATE ON MEDIA\r
+REFERENCING NEW AS n\r
+FOR EACH ROW\r
+BEGIN ATOMIC\r
+    UPDATE MEDIADESCRIPTION SET DESCRIPTION = FULLDESC(ITEMID, MEDIAID, MEDIAFILEID) WHERE MEDIAID = N.ID;\r
+END\r
+@\r
+\r
+\r
+--CALL SYSPROC.ADMIN_CMD('REORG TABLE DB2ADMIN.MEDIA')\r
+--@\r
+\r
+-- //@UNDO\r
+\r
+ALTER TABLE MEDIA DROP COLUMN FILECOUNT\r
+@\r
+\r
+CALL SYSPROC.ADMIN_CMD('REORG TABLE MEDIA')\r
+@\r
diff --git a/server/user.jobengine.osgi.db/src/user/jobengine/search/IExecutionDurationNotification.java b/server/user.jobengine.osgi.db/src/user/jobengine/search/IExecutionDurationNotification.java
new file mode 100644 (file)
index 0000000..741bb16
--- /dev/null
@@ -0,0 +1,8 @@
+package user.jobengine.search;\r
+\r
+import java.time.Duration;\r
+import java.time.Instant;\r
+\r
+public interface IExecutionDurationNotification {\r
+       void notify(Duration duration);\r
+}\r
diff --git a/server/user.jobengine.osgi.db/src/user/jobengine/search/SearchSQL.java b/server/user.jobengine.osgi.db/src/user/jobengine/search/SearchSQL.java
new file mode 100644 (file)
index 0000000..33bfe44
--- /dev/null
@@ -0,0 +1,130 @@
+package user.jobengine.search;\r
+\r
+import java.util.List;\r
+import java.util.stream.Collectors;\r
+\r
+import org.apache.ibatis.jdbc.SQL;\r
+\r
+public class SearchSQL {\r
+\r
+       private static String getCriteriasRegexPattern(String criteria) {\r
+               String[] criterias = criteria.replace("*", "").replace("+", " ").split(" ");\r
+               if (criteria.startsWith("\"") && criteria.endsWith("\""))\r
+                       criterias = new String[] { criteria.replace("\"", "") };\r
+\r
+               StringBuilder sb = new StringBuilder();\r
+               for (String word : criterias) {\r
+                       if (sb.length() > 0)\r
+                               sb.append("|");\r
+                       sb.append(word);\r
+               }\r
+               return sb.toString();\r
+       }\r
+\r
+       public static SQL descriptionsQuery(String criteria, List<Long> mediaIds) {\r
+               String criteriasPattern = getCriteriasRegexPattern(criteria);\r
+               List<String> ids = mediaIds.stream().map(id -> String.valueOf(id)).collect(Collectors.toList());\r
+               SQL sql = new SQL();\r
+               sql.SELECT("mediaid");\r
+               sql.SELECT(String.format("HIGHLIGHT(description, '<span class=''rhl''>', '</span>', '%s') description", criteriasPattern));\r
+               sql.FROM("MEDIADESCRIPTION");\r
+               sql.WHERE(String.format("mediaid IN (%s)", String.join(",", ids)));\r
+               return sql;\r
+       }\r
+\r
+//     private PreparedStatement createGroupingStatement(Connection connection, String criteria, SearchOptions options) throws Exception {\r
+//     boolean simpleSearch = manager.getSystemConfig().value("datasource.mediacube.simple-search", true);\r
+//     String criteriasPattern = getCriteriasRegexPattern(criteria);\r
+//\r
+//     SQL innerSql = new SQL();\r
+//     innerSql.SELECT("max(vi.mediaid)");\r
+//     innerSql.FROM("VW_ITEMS_WITH_PATH vi", "MEDIADESCRIPTION md");\r
+//     innerSql.WHERE("vi.mediafileid = md.mediafileid");\r
+//\r
+//     if (simpleSearch) {\r
+//             // TODO ezen az agon nem jo!!!!!\r
+//             String simpleTextCriteria = formatSimpleSearchValue(criteria);\r
+//             if (simpleTextCriteria != null && simpleTextCriteria.trim().length() > 0) {\r
+//                     innerSql.AND();\r
+//                     innerSql.WHERE("(");\r
+//                     innerSql.WHERE(String.format("%s LIKE '%%%s%%'", "vi.mediatitle", simpleTextCriteria));\r
+//                     innerSql.OR();\r
+//                     innerSql.WHERE(String.format("%s LIKE '%%%s%%'", "vi.itemtitle", simpleTextCriteria));\r
+//                     innerSql.OR();\r
+//                     innerSql.WHERE(String.format("%s LIKE '%%%s%%'", "vi.mediarelativepath", simpleTextCriteria));\r
+//                     innerSql.WHERE(")");\r
+//             }\r
+//     } else {\r
+//             String textCriteria = formatSearchValue(criteria);\r
+//             if (textCriteria != null && textCriteria.trim().length() > 0) {\r
+//                     innerSql.AND();\r
+//                     innerSql.WHERE(String.format("CONTAINS(md.description, '%s') >= 1", textCriteria));\r
+//             }\r
+//     }\r
+//     innerSql.GROUP_BY("vi.mediarelativepath");\r
+//\r
+//     SQL mainSql = new SQL();\r
+//     if (options.isCountOnly())\r
+//             mainSql.SELECT("COUNT(1) AS NumberOfRecords");\r
+//     else\r
+//             mainSql.SELECT("vi.itemid", "vi.itemtitle", "vi.mediaid", "vi.mediatitle", "vi.mediarelativepath", "vi.mediaarchived", "vi.mediacreation",\r
+//                             "vi.medialength", "vf.mediafilecount",\r
+//                             String.format("HIGHLIGHT(md.description, '<span class=''rhl''>', '</span>', '%s') description", criteriasPattern));\r
+//\r
+//     mainSql.FROM("VW_ITEMS_WITH_PATH vi", "VW_MEDIAFILES vf", "MEDIADESCRIPTION md");\r
+//     mainSql.WHERE("vf.mediaid = vi.mediaid");\r
+//     mainSql.AND();\r
+//     mainSql.WHERE("vi.mediafileid = md.mediafileid");\r
+//     mainSql.AND();\r
+//     mainSql.WHERE(String.format("vi.mediaid IN (\r\n%s\r\n)", innerSql.toString()));\r
+//\r
+//     StringBuilder criteriaForType = options.getCriteriaForType();\r
+//     if (criteriaForType != null) {\r
+//             mainSql.AND();\r
+//             mainSql.WHERE(String.format("vi.mediaitemtypeid IN (%s)", criteriaForType.toString()));\r
+//     }\r
+//\r
+//     StringBuilder criteriaForTag = options.getCriteriaForTag();\r
+//     if (criteriaForTag != null) {\r
+//             SQL tagSql = new SQL();\r
+//             tagSql.SELECT("mediaid");\r
+//             tagSql.FROM("MEDIATAGS");\r
+//             tagSql.WHERE(String.format("vi.mediaitemtypeid IN (%s)", criteriaForTag.toString()));\r
+//\r
+//             mainSql.AND();\r
+//             mainSql.WHERE(String.format("vi.mediaid IN (%s)", tagSql.toString()));\r
+//     }\r
+//\r
+//     if (options.getFrom() != null) {\r
+//             mainSql.AND();\r
+//             mainSql.WHERE(String.format("vi.mediacreation > '%s'", df.format(options.getFrom())));\r
+//     }\r
+//\r
+//     if (options.getTo() != null) {\r
+//             mainSql.AND();\r
+//             mainSql.WHERE(String.format("vi.mediacreation < '%s'", df.format(options.getTo())));\r
+//     }\r
+//\r
+//     if (options.isMissingProxy()) {\r
+//             mainSql.AND();\r
+//             mainSql.WHERE("vf.mediafilecount = 1");\r
+//     }\r
+//\r
+//     if (options.getDescLength() > 0) {\r
+//             mainSql.AND();\r
+//             mainSql.WHERE(String.format("LENGTH(vi.mediadescription) < %s", options.getDescLength()));\r
+//     }\r
+//\r
+//     if (!options.isCountOnly() && (options.getToResult() != 0)) {\r
+//             mainSql.ORDER_BY("vi.mediacreation DESC");\r
+//             mainSql.LIMIT((options.getToResult() - options.getFromResult()));\r
+//             mainSql.OFFSET(options.getFromResult());\r
+//     }\r
+//\r
+//     String query = mainSql.toString();\r
+//     logger.info(query);\r
+//     PreparedStatement st = connection.prepareStatement(query, ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_UPDATABLE);\r
+//     return st;\r
+//}\r
+\r
+}\r