git-tfs-id: [http://tfs.userrendszerhaz.hu:8080/tfs/DefaultCollection]$/MediaCube...
authorVásáry Dániel <daniel.vasary@userrendszerhaz.hu>
Mon, 19 Mar 2018 15:59:32 +0000 (15:59 +0000)
committerVásáry Dániel <daniel.vasary@userrendszerhaz.hu>
Mon, 19 Mar 2018 15:59:32 +0000 (15:59 +0000)
19 files changed:
server/-configuration/scheduledjobs.json
server/user.jobengine.executors/src/user/jobengine/server/steps/ImportStatisticsStep.java
server/user.jobengine.executors/src/user/jobengine/server/steps/RecordingsArchiveItemBuilderStep.java
server/user.jobengine.osgi.commons/src/user/commons/nosql/NoSQLUtils.java
server/user.jobengine.osgi.commons/test/user/common/octopus/test/OctopusDataMinerTest.java
server/user.jobengine.osgi.db/src/user/jobengine/db/ArchivedMedia.java
server/user.jobengine.osgi.db/src/user/jobengine/db/IItemManager.java
server/user.jobengine.osgi.db/src/user/jobengine/db/ItemDAOEx.java
server/user.jobengine.osgi.db/src/user/jobengine/db/ItemManager.java
server/user.jobengine.osgi.server/pages/newshistory.zul
server/user.jobengine.osgi.server/pages/searchitems.zul
server/user.jobengine.osgi.server/pages/statistics.zul
server/user.jobengine.osgi.server/pages/statisticsdetails.zul
server/user.jobengine.osgi.server/src/user/jobengine/zk/model/CachedListModel.java
server/user.jobengine.osgi.server/src/user/jobengine/zk/model/NewsHistoryCharts.java
server/user.jobengine.osgi.server/src/user/jobengine/zk/model/NewsHistoryModel.java
server/user.jobengine.osgi.server/src/user/jobengine/zk/model/SearchModel.java
server/user.jobengine.osgi.server/src/user/jobengine/zk/model/StatisticsDetailsModel.java
server/user.jobengine.osgi.server/src/user/jobengine/zk/model/StatisticsModel.java

index c29446f80f10ac84d68d009b6394bd59c670fe51..b2fc4826da6b7c4062004120e53e56bec4de430b 100644 (file)
@@ -31,7 +31,7 @@
       "template": "import-statistics.xml",\r
       "cronexpression": "0 0 0/1 1/1 * ? *",\r
       "parameters": [ \r
-       {"name": "daysBeforeNow", "value": 6, "type": "java.lang.Integer"}\r
+       {"name": "daysBeforeNow", "value": 1, "type": "java.lang.Integer"}\r
       ]\r
        },\r
        {\r
index e5e88c40c40bb0ada1ce8660715dd7de017cfaa8..4856bf15eac5db9a0f4a19d1af3072b18a91ffd2 100644 (file)
@@ -63,6 +63,21 @@ public class ImportStatisticsStep extends JobStep {
                return result;\r
        }\r
 \r
+       private BasicDBObject createStory(BasicDBObject story, String label, String objId, long duration, long rdCount, long sfCount, long parentStoryId,\r
+                       String reporters) {\r
+               BasicDBObject raw = new BasicDBObject();\r
+               raw.put(IOctopusAPI.ID, NoSQLUtils.asLong(story, IOctopusAPI.ID));\r
+               raw.put(IOctopusAPI.NAME, NoSQLUtils.asString(story, IOctopusAPI.NAME));\r
+               raw.put(IOctopusAPI.PARENT_STORY_ID, parentStoryId);\r
+               raw.put(IOctopusAPI.REPORTERS, reporters);\r
+               raw.put(IOctopusAPI.OBJ_ID, objId);\r
+               raw.put(IOctopusAPI.LABEL, label);\r
+               raw.put("duration", duration);\r
+               raw.put(IOctopusAPI.REF_RUNDOWN, rdCount);\r
+               raw.put(IOctopusAPI.REF_STORYFOLDER, sfCount);\r
+               return raw;\r
+       }\r
+\r
        @StepEntry\r
        public Object[] execute(int daysBeforeNow, IJobEngine jobEngine, IJobRuntime jobRuntime) throws Exception {\r
                marker = jobRuntime.getMarker();\r
@@ -92,93 +107,7 @@ public class ImportStatisticsStep extends JobStep {
                stories.putAll(folderStories);\r
                logger.info(jobRuntime.getMarker(), "Gyűjtőkben megtalálható anyagok száma {}", stories.size());\r
 \r
-               BasicDBObject planStat = new BasicDBObject();\r
-\r
-               BasicDBObject typeStat = new BasicDBObject();\r
-               BasicDBObject typeStatRawData = new BasicDBObject();\r
-               typeStat.put("rawData", typeStatRawData);\r
-               long sumDuration = 0;\r
-               long sumIngestDuration = 0;\r
-               long sumIngestCount = 0;\r
-               long sumArchiveDuration = 0;\r
-               long sumArchiveCount = 0;\r
-\r
-               List<BasicDBObject> rawData = new ArrayList<>();\r
-               for (BasicDBObject story : stories.values()) {\r
-                       List<BasicDBObject> mosObjects = NoSQLUtils.asList(story, IOctopusAPI.MOS_OBJECTS);\r
-                       for (BasicDBObject mos : mosObjects) {\r
-                               String label = NoSQLUtils.asString(mos, IOctopusAPI.LABEL);\r
-                               long duration = NoSQLUtils.asLong(mos, "duration");\r
-                               long rdCount = NoSQLUtils.asLong(story, IOctopusAPI.REF_RUNDOWN);\r
-                               long sfCount = NoSQLUtils.asLong(story, IOctopusAPI.REF_STORYFOLDER);\r
-                               long parentStoryId = NoSQLUtils.asLong(story, IOctopusAPI.PARENT_STORY_ID);\r
-\r
-                               BasicDBObject raw = new BasicDBObject();\r
-                               raw.put(IOctopusAPI.ID, NoSQLUtils.asLong(story, IOctopusAPI.ID));\r
-                               raw.put(IOctopusAPI.NAME, NoSQLUtils.asString(story, IOctopusAPI.NAME));\r
-                               raw.put(IOctopusAPI.PARENT_STORY_ID, parentStoryId);\r
-                               raw.put(IOctopusAPI.REPORTERS, NoSQLUtils.asString(story, IOctopusAPI.REPORTERS));\r
-                               raw.put(IOctopusAPI.OBJ_ID, NoSQLUtils.asString(mos, IOctopusAPI.OBJ_ID));\r
-                               raw.put(IOctopusAPI.LABEL, label);\r
-                               raw.put("duration", duration);\r
-                               raw.put(IOctopusAPI.REF_RUNDOWN, rdCount);\r
-                               raw.put(IOctopusAPI.REF_STORYFOLDER, sfCount);\r
-\r
-                               long ingestCount = 0;\r
-                               long ingestDuration = 0;\r
-                               BasicDBObject ingestInfo = manager.getIngestInfo(scheduledDate, String.valueOf(parentStoryId));\r
-                               if (ingestInfo != null) {\r
-                                       ingestCount = ingestInfo.getLong("count");\r
-                                       ingestDuration = ingestInfo.getLong("duration");\r
-                                       raw.put("ingest_count", ingestCount);\r
-                                       raw.put("ingest_duration", ingestDuration);\r
-                                       sumIngestCount += ingestCount;\r
-                                       sumIngestDuration += ingestDuration;\r
-                               }\r
-\r
-                               long archiveCount = 0;\r
-                               long archiveDuration = 0;\r
-                               BasicDBObject archiveInfo = manager.getArchiveInfo(scheduledDate, String.valueOf(parentStoryId));\r
-                               if (archiveInfo != null) {\r
-                                       archiveCount = archiveInfo.getLong("count");\r
-                                       archiveDuration = archiveInfo.getLong("duration");\r
-                                       raw.put("archive_count", archiveCount);\r
-                                       raw.put("archive_duration", archiveDuration);\r
-                                       sumArchiveCount += archiveCount;\r
-                                       sumArchiveDuration += archiveDuration;\r
-                               }\r
-\r
-                               rawData.add(raw);\r
-\r
-                               //planStat\r
-                               if (sfCount > 0 && rdCount == 0) {\r
-                                       NoSQLUtils.addLong(planStat, "skip_count", 1);\r
-                                       NoSQLUtils.addLong(planStat, "skip_duration", duration);\r
-                               }\r
-                               if (rdCount > 0) {\r
-                                       NoSQLUtils.addLong(planStat, "onair_count", 1);\r
-                                       NoSQLUtils.addLong(planStat, "onair_duration", duration);\r
-\r
-                                       //typeStat\r
-                                       sumDuration += duration;\r
-                                       if (typeStatRawData.containsKey(label)) {\r
-                                               BasicDBObject dbo = NoSQLUtils.asDBObject(typeStatRawData, label);\r
-                                               dbo.put("count", dbo.getInt("count") + 1);\r
-                                               dbo.put("duration", dbo.getInt("duration") + duration);\r
-                                       } else\r
-                                               typeStatRawData.put(label, new BasicDBObject("count", 1).append("duration", duration));\r
-                               }\r
-                       }\r
-               }\r
-\r
-               planStat.put("all_count", rawData.size());\r
-               planStat.put("all_duration", sumDuration);\r
-               planStat.put("archive_count", sumArchiveCount);\r
-               planStat.put("archive_duration", sumArchiveDuration);\r
-               planStat.put("ingest_count", sumIngestCount);\r
-               planStat.put("ingest_duration", sumIngestDuration);\r
-\r
-               store(scheduledDate, rawData, typeStat, planStat);\r
+               storeStories(scheduledDate, stories);\r
                return null;\r
        }\r
 \r
@@ -281,7 +210,7 @@ public class ImportStatisticsStep extends JobStep {
                        String reporterNames = "";\r
                        if (reporters != null && reporters.size() > 0) {\r
                                for (BasicDBObject reporter : reporters) {\r
-                                       String userName = NoSQLUtils.asString(reporter, "userName");\r
+                                       String userName = NoSQLUtils.asString(reporter, "longName");\r
                                        if (userName != null) {\r
                                                if (reporterNames.length() > 0)\r
                                                        reporterNames += ", ";\r
@@ -296,7 +225,7 @@ public class ImportStatisticsStep extends JobStep {
                return result;\r
        }\r
 \r
-       private void store(Calendar scheduledDate, List<BasicDBObject> stories, BasicDBObject typeStat, BasicDBObject planStat) {\r
+       private void store(Calendar scheduledDate, List<BasicDBObject> stories, BasicDBObject typeStat, BasicDBObject planStat, BasicDBObject reporterStat) {\r
                BasicDBObject dailyHistory = new BasicDBObject();\r
                dailyHistory.put("dateTime", scheduledDate.getTime());\r
                BasicDBList list = new BasicDBList();\r
@@ -306,10 +235,103 @@ public class ImportStatisticsStep extends JobStep {
                }\r
                dailyHistory.put("typeStat", typeStat);\r
                dailyHistory.put("planStat", planStat);\r
+               dailyHistory.put("reporterStat", reporterStat);\r
 \r
                DBCollection collection = db.getCollection("daily_news_history");\r
                collection.remove(new BasicDBObject("dateTime", scheduledDate.getTime()));\r
                collection.save(dailyHistory);\r
        }\r
 \r
+       private void storeStories(Calendar scheduledDate, Map<Long, BasicDBObject> stories) {\r
+               BasicDBObject planStat = new BasicDBObject();\r
+               BasicDBObject typeStat = new BasicDBObject();\r
+               BasicDBObject reporterStat = new BasicDBObject();\r
+\r
+               List<BasicDBObject> rawData = new ArrayList<>();\r
+               List<String> processed = new ArrayList<>();\r
+\r
+               for (BasicDBObject story : stories.values()) {\r
+                       List<BasicDBObject> mosObjects = NoSQLUtils.asList(story, IOctopusAPI.MOS_OBJECTS);\r
+                       for (BasicDBObject mos : mosObjects) {\r
+                               String objId = NoSQLUtils.asString(mos, IOctopusAPI.OBJ_ID);\r
+                               long parentStoryId = NoSQLUtils.asLong(story, IOctopusAPI.PARENT_STORY_ID);\r
+                               String key = String.format("%d-%s", parentStoryId, objId);\r
+                               if (processed.contains(key))\r
+                                       continue;\r
+                               processed.add(key);\r
+\r
+                               String label = NoSQLUtils.asString(mos, IOctopusAPI.LABEL);\r
+                               long duration = NoSQLUtils.asLong(mos, "duration");\r
+                               long rdCount = NoSQLUtils.asLong(story, IOctopusAPI.REF_RUNDOWN);\r
+                               long sfCount = NoSQLUtils.asLong(story, IOctopusAPI.REF_STORYFOLDER);\r
+                               String reporters = NoSQLUtils.asString(story, IOctopusAPI.REPORTERS);\r
+\r
+                               BasicDBObject raw = createStory(story, label, objId, duration, rdCount, sfCount, parentStoryId, reporters);\r
+                               rawData.add(raw);\r
+\r
+                               NoSQLUtils.addLong(planStat, "all_count", 1);\r
+                               NoSQLUtils.addLong(planStat, "all_duration", duration);\r
+\r
+                               BasicDBObject perTypeStat = NoSQLUtils.asDBObjectOrCreate(typeStat, label);\r
+                               NoSQLUtils.addLong(perTypeStat, "all_count", 1);\r
+                               NoSQLUtils.addLong(perTypeStat, "all_duration", duration);\r
+\r
+                               BasicDBObject perReporterStat = NoSQLUtils.asDBObjectOrCreate(reporterStat, reporters);\r
+                               NoSQLUtils.addLong(perReporterStat, "all_count", 1);\r
+                               NoSQLUtils.addLong(perReporterStat, "all_duration", duration);\r
+\r
+                               BasicDBObject ingestInfo = manager.getIngestInfo(scheduledDate, String.valueOf(parentStoryId));\r
+                               if (ingestInfo != null) {\r
+                                       long ingestCount = ingestInfo.getLong("count");\r
+                                       long ingestDuration = ingestInfo.getLong("duration");\r
+                                       raw.put("ingest_count", ingestCount);\r
+                                       raw.put("ingest_duration", ingestDuration);\r
+                                       NoSQLUtils.addLong(planStat, "ingest_count", ingestCount);\r
+                                       NoSQLUtils.addLong(planStat, "ingest_duration", ingestDuration);\r
+                                       NoSQLUtils.addLong(perTypeStat, "ingest_count", ingestCount);\r
+                                       NoSQLUtils.addLong(perTypeStat, "ingest_duration", ingestDuration);\r
+                                       NoSQLUtils.addLong(perReporterStat, "ingest_count", ingestCount);\r
+                                       NoSQLUtils.addLong(perReporterStat, "ingest_duration", ingestDuration);\r
+                               }\r
+\r
+                               BasicDBObject archiveInfo = manager.getArchiveInfo(scheduledDate, String.valueOf(parentStoryId));\r
+                               if (archiveInfo != null) {\r
+                                       long archiveCount = archiveInfo.getLong("count");\r
+                                       long archiveDuration = archiveInfo.getLong("duration");\r
+                                       raw.put("archive_count", archiveCount);\r
+                                       raw.put("archive_duration", archiveDuration);\r
+                                       NoSQLUtils.addLong(planStat, "archive_count", archiveCount);\r
+                                       NoSQLUtils.addLong(planStat, "archive_duration", archiveDuration);\r
+                                       NoSQLUtils.addLong(perTypeStat, "archive_count", archiveCount);\r
+                                       NoSQLUtils.addLong(perTypeStat, "archive_duration", archiveDuration);\r
+                                       NoSQLUtils.addLong(perReporterStat, "archive_count", archiveCount);\r
+                                       NoSQLUtils.addLong(perReporterStat, "archive_duration", archiveDuration);\r
+                               }\r
+\r
+                               //skipped\r
+                               if (sfCount > 0 && rdCount == 0) {\r
+                                       NoSQLUtils.addLong(planStat, "skip_count", 1);\r
+                                       NoSQLUtils.addLong(planStat, "skip_duration", duration);\r
+                                       NoSQLUtils.addLong(perTypeStat, "skip_count", 1);\r
+                                       NoSQLUtils.addLong(perTypeStat, "skip_duration", duration);\r
+                                       NoSQLUtils.addLong(perReporterStat, "skip_count", 1);\r
+                                       NoSQLUtils.addLong(perReporterStat, "skip_duration", duration);\r
+                               }\r
+\r
+                               //onair\r
+                               if (rdCount > 0) {\r
+                                       NoSQLUtils.addLong(planStat, "onair_count", 1);\r
+                                       NoSQLUtils.addLong(planStat, "onair_duration", duration);\r
+                                       NoSQLUtils.addLong(perTypeStat, "onair_count", 1);\r
+                                       NoSQLUtils.addLong(perTypeStat, "onair_duration", duration);\r
+                                       NoSQLUtils.addLong(perReporterStat, "onair_count", 1);\r
+                                       NoSQLUtils.addLong(perReporterStat, "onair_duration", duration);\r
+                               }\r
+\r
+                       }\r
+               }\r
+\r
+               store(scheduledDate, rawData, typeStat, planStat, reporterStat);\r
+       }\r
+\r
 }\r
index daf8c1e08dc524c814de0422a650d50265fc6b7b..2e0bfd0ee8f2b1417cd47d3876335dc68879720c 100644 (file)
@@ -115,12 +115,12 @@ public class RecordingsArchiveItemBuilderStep extends JobStep {
                                public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {\r
                                        FileVisitResult result = FileVisitResult.SKIP_SUBTREE;\r
 \r
-                                       if (dir.equals(Paths.get(sourcePath)) || "HIRADO".equals(dir.toFile().getName().toUpperCase())\r
-                                                       || "NAPIAKT".equals(dir.toFile().getName().toUpperCase()))\r
+                                       if (dir.equals(Paths.get(sourcePath)) || "2017".equals(dir.toFile().getName().toUpperCase())\r
+                                                       || "2018".equals(dir.toFile().getName().toUpperCase()))\r
                                                result = FileVisitResult.CONTINUE;\r
                                        else {\r
-                                               if ("HIRADO".equals(dir.getParent().toFile().getName().toUpperCase())\r
-                                                               || "NAPIAKT".equals(dir.getParent().toFile().getName().toUpperCase())) {\r
+                                               if ("2017".equals(dir.getParent().toFile().getName().toUpperCase())\r
+                                                               || "2018".equals(dir.getParent().toFile().getName().toUpperCase())) {\r
                                                        try {\r
                                                                startDateformat.parse(dir.toFile().getName());\r
                                                                result = FileVisitResult.CONTINUE;\r
index 20d0ec55ea824507b3c76f8866c04cbf40707baf..4938a66a1ff8265cd43a1c5c9a678d11904d781e 100644 (file)
@@ -41,6 +41,15 @@ public class NoSQLUtils {
                return result;\r
        }\r
 \r
+       public static BasicDBObject asDBObjectOrCreate(BasicDBObject obj, String name) {\r
+               BasicDBObject result = asDBObject(obj, name);\r
+               if (result == null) {\r
+                       result = new BasicDBObject();\r
+                       obj.put(name, result);\r
+               }\r
+               return result;\r
+       }\r
+\r
        public static List<BasicDBObject> asList(BasicDBList obj) {\r
                List<BasicDBObject> result = null;\r
                if (obj != null && obj.size() > 0)\r
index 5956ab403ea819f2a39eb826d122f5797bb9ceaf..2b59abb57c714487806527089df0c82270899687 100644 (file)
@@ -295,6 +295,12 @@ public class OctopusDataMinerTest {
                assertNotNull(stepClass);\r
        }\r
 \r
+       //      @Test\r
+       //      public void test7() throws Exception {\r
+       //              String x = "aaaassss";\r
+       //              System.out.println(x.substring(0, 200));\r
+       //      }\r
+\r
        @Test\r
        public void testClient() {\r
                ResteasyWebTarget webTarget = new ResteasyClientBuilder().build().target("http://10.10.1.28/services/rest/octopus/");\r
index 75db953f1276d693a1c700e0f0e7bdf087ad51ce..e6e0d5db16ff46a3c032d1570e54231eadebe6c7 100644 (file)
@@ -3,6 +3,7 @@ package user.jobengine.db;
 public class ArchivedMedia {\r
        private Item item;\r
        private Media media;\r
+       private String relevant;\r
 \r
        public Item getItem() {\r
                return item;\r
@@ -12,6 +13,10 @@ public class ArchivedMedia {
                return media;\r
        }\r
 \r
+       public String getRelevant() {\r
+               return relevant;\r
+       }\r
+\r
        public void setItem(Item item) {\r
                this.item = item;\r
        }\r
@@ -20,4 +25,8 @@ public class ArchivedMedia {
                this.media = media;\r
        }\r
 \r
+       public void setRelevant(String relevant) {\r
+               this.relevant = relevant;\r
+       }\r
+\r
 }\r
index 7ac032f9363ff4f722cacf9f64be041cdd208432..0a24ad30a8cbc8912ba459d21443c951291ada8a 100644 (file)
@@ -347,7 +347,7 @@ public interface IItemManager extends IEntityPersister {
         */\r
        IEntityBase retrieveCached(Class<? extends IEntityBase> baseClass, Object key);\r
 \r
-       SearchResult<ArchivedMedia> search(String criteria, int fromResult, int toResult);\r
+       SearchResult<ArchivedMedia> search(String criteria, List<String> searchFilters, int fromResult, int toResult);\r
 \r
        /**\r
         * A bemeneti paraméterként kapott keresési feltételeknek megfelelő Anyagokat lekéri az adatbázisból és SearchResult objektumba csomagolva visszatér.\r
index 8357e77514fcb61e19de680df7f097fd34f586ff..4a248c2e3633171133c072bbf3d04ac720b2ef8a 100644 (file)
@@ -3,6 +3,7 @@ package user.jobengine.db;
 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
@@ -57,6 +58,45 @@ public class ItemDAOEx {
                return resultQuery.toString();\r
        }\r
 \r
+       private PreparedStatement createArchiveMediaSearchStatement(Connection connection, String criteria, 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 * FROM ((");\r
+               sql.append("SELECT DISTINCT m.id, m.title FROM ITEM i, MEDIA m, MEDIAFILE mf");\r
+               sql.append(" WHERE ((CONTAINS(i.title, ?) >= 1) OR (CONTAINS(i.description, ?) >= 1)) AND m.itemid = i.id AND mf.mediaid = m.id");\r
+               if (typeIDs != null)\r
+                       sql.append(" AND m.itemtypeid IN ").append(typeCriteria.toString());\r
+               sql.append(")UNION(");\r
+               sql.append("SELECT DISTINCT m2.id,m2.title FROM ITEM i2, MEDIA m2, MEDIAFILE mf2");\r
+               sql.append(" WHERE ((CONTAINS(m2.title, ?) >= 1) OR (CONTAINS(m2.description, ?) >= 1)) AND m2.itemid = i2.id AND mf2.mediaid = m2.id");\r
+               if (typeIDs != null)\r
+                       sql.append(" AND m2.itemtypeid IN ").append(typeCriteria.toString());\r
+               sql.append(")UNION(");\r
+               sql.append("SELECT DISTINCT m3.id,m3.title 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
+               if (typeIDs != null)\r
+                       sql.append(" AND m3.itemtypeid IN ").append(typeCriteria.toString());\r
+               sql.append(")) ORDER BY title");\r
+\r
+               String query = sql.toString();\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 List<SearchResult> getResultHeaders(Connection connection, QueryObject queryObject, String innerQuery) {\r
                List<SearchResult> results = new ArrayList<SearchResult>();\r
                String typeQuery;\r
@@ -103,6 +143,21 @@ public class ItemDAOEx {
                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
@@ -322,33 +377,18 @@ public class ItemDAOEx {
                return result;\r
        }\r
 \r
-       public SearchResult<ArchivedMedia> searchArchivedMedia(String criteria, int fromResult, int toResult) {\r
+       public SearchResult<ArchivedMedia> searchArchivedMedia(String criteria, List<String> searchFilters, int fromResult, 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
-\r
                try {\r
-                       StringBuffer sql = new StringBuffer();\r
 \r
-                       sql.append("SELECT * FROM ((");\r
-                       sql.append("SELECT DISTINCT m.id,m.title FROM ITEM i, MEDIA m, MEDIAFILE mf");\r
-                       sql.append(" WHERE ((CONTAINS(i.title, ?) >= 1) OR (CONTAINS(i.description, ?) >= 1)) AND m.itemid = i.id AND mf.mediaid = m.id");\r
-                       sql.append(")UNION(");\r
-                       sql.append("SELECT DISTINCT m2.id,m2.title FROM ITEM i2, MEDIA m2, MEDIAFILE mf2");\r
-                       sql.append(" WHERE ((CONTAINS(m2.title, ?) >= 1) OR (CONTAINS(m2.description, ?) >= 1)) AND m2.itemid = i2.id AND mf2.MEDIAID = m2.id");\r
-                       sql.append(")UNION(");\r
-                       sql.append("SELECT DISTINCT m3.id,m3.title 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
-\r
-                       String query = sql.toString();\r
-                       st = connection.prepareStatement(query, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);\r
-                       for (int s = 1; s <= 5; s++) {\r
-                               st.setString(s, criteria);\r
-                       }\r
+                       st = createArchiveMediaSearchStatement(connection, criteria, typeIDs);\r
                        rs = st.executeQuery();\r
                        rs.last();\r
                        result.setItemCount(rs.getRow());\r
@@ -363,7 +403,7 @@ public class ItemDAOEx {
                                        }\r
                                } else {\r
                                        if (result.getItemCount() > 0) {\r
-                                               throw new Exception("Invalid searchResult 'from' position: " + fromResult + " total records: " + result.getItemCount() + " " + query);\r
+                                               throw new Exception("Invalid searchResult 'from' position: " + fromResult + " total records: " + result.getItemCount());\r
                                        }\r
                                }\r
                        } else {\r
@@ -372,6 +412,9 @@ public class ItemDAOEx {
 \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
                        while (rs.next() && maxRecords > 0) {\r
@@ -380,9 +423,16 @@ public class ItemDAOEx {
                                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
@@ -412,4 +462,37 @@ public class ItemDAOEx {
 \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) + "<b>" + content.substring(pos, pos + c.length()) + "</b>"\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
index 831a1f13da760e7fbf488af34b4615d63610bf3a..3a52df5a05a8cb1ef440e86b295c1e278e3ba67a 100644 (file)
@@ -947,11 +947,11 @@ public class ItemManager extends MemoryCache implements IItemManager {
        }\r
 \r
        @Override\r
-       public SearchResult<ArchivedMedia> search(String criteria, int fromResult, int toResult) {\r
+       public SearchResult<ArchivedMedia> search(String criteria, List<String> searchFilters, int fromResult, int toResult) {\r
                traceIn();\r
                SearchResult<ArchivedMedia> result = null;\r
                ItemDAOEx itemDb = new ItemDAOEx(this);\r
-               result = itemDb.searchArchivedMedia(criteria, fromResult, toResult);\r
+               result = itemDb.searchArchivedMedia(criteria, searchFilters, fromResult, toResult);\r
                traceOut();\r
                return result;\r
        }\r
index a09331392ea62035ee797e06660d0ebcdaccf64c..6b59d67e18275eba68d91e7dd941b07ca07472ac 100644 (file)
@@ -3,7 +3,7 @@
        <script>\r
 \r
                function frameToTC(value) {\r
-                       console.log('frameToTC '  + value)\r
+                       //console.log('frameToTC '  + value)\r
                        var reminder = value;\r
                        var hour = Math.floor(reminder / (60 * 60 * 25));\r
             reminder = reminder % (60 * 60 * 25);\r
index bcc66e25e9549be4eda15989659a940ee1f69032..416fc3dbbd0467e25bb49e2d23ee76a777a29041 100644 (file)
@@ -34,6 +34,7 @@ div.z-row-content .rating {
 }\r
        </style>\r
        <div id="scdiv" width="100%" height="100%" apply="org.zkoss.bind.BindComposer" viewModel="@id('vm') @init('user.jobengine.zk.model.SearchModel')">\r
+               <timer id="timer" delay="100" repeats="true" onTimer="@command('uiTick')" />\r
                <borderlayout>\r
                        <west border="none" size="60%" splittable="true" minsize="250">\r
                                <div height="100%" width="100%">\r
@@ -42,22 +43,16 @@ div.z-row-content .rating {
                                                        tooltiptext="Gépelje be a keresendő kifejezést és nyomja meg az Enter-t." onOK="@command('doSearch')" />\r
                                                <toolbar vflex="min" style="font-size:8px">\r
                                                        <checkbox checked="@bind(vm.allChecked)" />\r
-                                                       <toolbarbutton label="Hír bejátszó" mode="toggle" checked="@bind(vm.newsFeedChecked)" />\r
-                                                       <toolbarbutton label="Hír nyersanyag" mode="toggle" checked="@bind(vm.newsRawChecked)" />\r
-                                                       <toolbarbutton label="Műsor" mode="toggle" checked="@bind(vm.materialChecked)" />\r
-                                                       <toolbarbutton label="Műsor nyersanyag" mode="toggle" checked="@bind(vm.materialRawChecked)" />\r
-                                                       <toolbarbutton label="Promo" mode="toggle" checked="@bind(vm.promoChecked)" />\r
-                                                       <toolbarbutton label="Promo nyersanyag" mode="toggle" checked="@bind(vm.promoRawChecked)" />\r
-                                                       <toolbarbutton label="Reklám" mode="toggle" checked="@bind(vm.adChecked)" />\r
-                                                       <toolbarbutton label="Reklám nyersanyag" mode="toggle" checked="@bind(vm.adRawChecked)" />\r
-                                                       <toolbarbutton label="Visszarögzített" mode="toggle" checked="@bind(vm.recordingChecked) " />\r
-                                                       <toolbarbutton label="Egyéb" mode="toggle" checked="@bind(vm.otherChecked)" />\r
+                                                       <forEach items="@load(vm.typeFilterNames)" >\r
+                                                               <toolbarbutton label="@load(each)" mode="toggle" checked="@bind(vm.typeFilters[each]) @validator(vm.allFilterCheckedValidator)" />\r
+                                                       </forEach>                                                      \r
                                                </toolbar>\r
                                        </groupbox>\r
                                        <groupbox vflex="true" closable="false">\r
                                                <grid id="itemResults" sizedByContent="false" span="true" vflex="true" hflex="true" mold="paging" autopaging="false"\r
-                                                       model="@load(vm.searchResult)" activePage="@bind(vm.activePage)" selectedItem="@bind(vm.selectedObject)"\r
-                                                       style="border: none; background: #e3e3e3 !important;" oddRowSclass="listbox-odd-style" sclass="listbox-normal-style" emptyMessage="Nincs találat!">\r
+                                                       model="@load(vm.searchResult)" activePage="@bind(vm.activePage)" emptyMessage="Nincs találat!"\r
+                                                       style="border: none; background: #e3e3e3 !important;" oddRowSclass="listbox-odd-style" sclass="listbox-normal-style"\r
+                                                       onAfterRender="@command('onPaging')">\r
                                                        <columns>\r
                                                                <column hflex="min">\r
                                                                        <checkbox checked="@bind(vm.rowsExpanded)"/>\r
@@ -67,12 +62,12 @@ div.z-row-content .rating {
                                                                <column label="Fájlnév" hflex="min" align="left" />\r
                                                                <column label="Megtekinthető" hflex="min" align="right" />\r
                                                        </columns>\r
-                                                       <rows>\r
+                                                       <rows id="rows">\r
                                                                <template name="model">\r
                                                                        <row>\r
                                                                                <detail open="@load(vm.rowsExpanded)">\r
                                                                                        <hlayout>\r
-                                                                                               <image tooltiptext="Kattints a lejátszáshoz!" width="140px" height="90px" sclass="myimg" content="@load(each.media.poster) @converter('user.jobengine.zk.model.ByToImageConverter')" />\r
+                                                                                               <image tooltiptext="Kattints a lejátszáshoz!" width="140px" height="90px" sclass="myimg" content="@load(each.media.poster) @converter('user.jobengine.zk.model.ByToImageConverter')" onClick="@command('selectMediaArchive', selectedObject=each)" />\r
                                                                                                <div sclass="details">\r
                                                                                                        <div>\r
                                                                                                                <label value="Típus:" sclass="heavy" />\r
@@ -83,7 +78,7 @@ div.z-row-content .rating {
                                                                                                                <label value="@load(each.item.title)" />\r
                                                                                                        </div>\r
                                                                                                        <div>\r
-                                                                                                               <label value="@load(each.media.description)" maxlength="200" />\r
+                                                                                                               <label value="@load(each.relevant)" />\r
                                                                                                        </div>\r
                                                                                                </div>\r
                                                                                        </hlayout>\r
index 2a90328bdcbbba60e1c1abf9ff2fc7cff7d21231..3b15ea6157942cdbf6fbf8d2dbae21cac1f7f067 100644 (file)
                \r
                function statisticsYValue(value, series) {\r
                        var options = series[value - 1];\r
-                       console.log("statisticsYValue", series.name, value, series);\r
+                       //console.log("statisticsYValue", series.name, value, series);\r
                        return options == null ? "" : options.userOptions.name;\r
                }\r
        </script>\r
+       <style>\r
+       .highcharts-axis-labels {\r
+               background-color: red;\r
+       }       \r
+       </style>\r
        <vlayout vflex="1" hflex="1" apply="org.zkoss.bind.BindComposer" viewModel="@id('vm') @init('user.jobengine.zk.model.StatisticsModel')">\r
                <hbox height="40px" align="center">\r
                        <space bar="false" />\r
                                <radio label="Műsorok" />\r
                        </radiogroup>\r
                </hbox>\r
-               <div vflex="1" hflex="1" style="overflow:auto;" onAfterSize='chart.setWidth(new Integer(event.getWidth() - 20))'>\r
+               <div width="100%" height="70px" onAfterSize='legendChart.setWidth(new Integer(event.getWidth()));legendChart.setHeight(new Integer(event.getHeight()));'>\r
+                       <charts id="legendChart" type="column" />\r
+               </div>\r
+               <div hflex="1" vflex="1" style="overflow:auto;" onAfterSize='chart.setWidth(new Integer(event.getWidth() - 20));'>\r
                        <charts id="chart" type="spline" zoomType="x" />\r
                </div>\r
        </vlayout>\r
index 6e224cc11f342cc7e0f09a539c5eeffd25479a76..bca2cb24ea97f9a0ce909eb323281f8b80c5b5c4 100644 (file)
@@ -2,16 +2,19 @@
 <window id="wnd" title="Anyag életút" width="900px" sizable="true" border="normal" apply="org.zkoss.bind.BindComposer"\r
        viewModel="@id('vm') @init('user.jobengine.zk.model.StatisticsDetailsModel')" forward="onCancel=closeButton.onClick">\r
        <hlayout height="450px">\r
-               <grid sizedByContent="true" model="@load(vm.events)" vflex="true" hflex="true" style="border: none; background: #e3e3e3 !important;">\r
+               <grid id="grid" sizedByContent="true" model="@load(vm.events)" vflex="true" hflex="true" style="border: none; background: #e3e3e3 !important;">\r
                        <columns sizable="true">\r
                                <column forEach="${vm.columnList}" label="${each}"></column>\r
                        </columns>\r
-                       <rows>\r
+                       <rows id="rows">\r
                                <template name="model" var="r">\r
                                        <row>\r
-                                               <label forEach="${vm.columnList}" value="${r.get(each)}">\r
+                                               <label forEach="${vm.columnList}" value="${r.get(each)}" >\r
                                                        <attribute name="style" if="${vm.isSelected(r)}">\r
-                                                               color: green;\r
+                                                               font-weight: bold;\r
+                                                       </attribute>                                            \r
+                                                       <attribute name="style" if="${each eq 'Tag'}">\r
+                                                               background: ${r.get('Color')};\r
                                                        </attribute>                                            \r
                                                </label>\r
                                        </row>\r
index 7fa9b1b45ce49493f075860a666e7c00aab9311d..026a3b34e6b0016764a32343d8f9e23ada3baf0b 100644 (file)
@@ -36,9 +36,11 @@ public class CachedListModel extends ListModelList<ArchivedMedia> {
 \r
        private ArrayList<EventListener> eventListenerList = new ArrayList<EventListener>();\r
        private IItemManager itemManager = null;\r
+       private List<String> searchFilters;\r
 \r
-       public CachedListModel(String _searchValue) {\r
-               this.searchValue = _searchValue;\r
+       public CachedListModel(String searchValue, List<String> searchFilters) {\r
+               this.searchValue = searchValue;\r
+               this.searchFilters = searchFilters;\r
                this.itemManager = ItemManager.getInstance();\r
                //this.setMultiple(true);\r
                reinit();\r
@@ -79,6 +81,17 @@ public class CachedListModel extends ListModelList<ArchivedMedia> {
                }\r
        }\r
 \r
+       private String formatSearchValue(String value) {\r
+               String[] specials = new String[] { ":", "?", "%", "(", ")" };\r
+               String result = value;\r
+               for (String c : specials) {\r
+                       result = result.replace(c, "\\" + c);\r
+               }\r
+               if (!(result.startsWith("\"") && result.endsWith("\"")))\r
+                       result += "*";\r
+               return result;\r
+       }\r
+\r
        public int getCacheEnd() {\r
                return cacheEnd;\r
        }\r
@@ -137,7 +150,7 @@ public class CachedListModel extends ListModelList<ArchivedMedia> {
                        int endPos = (startPos + rowLimit);\r
                        endPos = ((this.resultSetSize < 0) || (endPos <= this.resultSetSize)) ? endPos : this.resultSetSize;\r
 \r
-                       SearchResult<ArchivedMedia> sr = this.itemManager.search(searchValue + "*", startPos, endPos);\r
+                       SearchResult<ArchivedMedia> sr = this.itemManager.search(formatSearchValue(searchValue), searchFilters, startPos, endPos);\r
 \r
                        if (sr != null) {\r
                                if (this.resultSetSize < 0) {\r
index bb77a23baf514e83bd19ab805d3393975df175ac..559974f11aeab3e74542fc2a0a981a15e4ba78db 100644 (file)
@@ -18,9 +18,8 @@ public class NewsHistoryCharts {
 \r
        private static void fill(Charts charts, BasicDBObject datas, String member) {\r
                Point maxPoint = null;\r
-               BasicDBObject rawData = (BasicDBObject) datas.get("rawData");\r
-               for (String name : rawData.keySet()) {\r
-                       BasicDBObject dbo = NoSQLUtils.asDBObject(rawData, name);\r
+               for (String name : datas.keySet()) {\r
+                       BasicDBObject dbo = NoSQLUtils.asDBObject(datas, name);\r
                        Number y = dbo.getLong(member);\r
                        Point point = new Point(name, y);\r
                        charts.getSeries().addPoint(point);\r
@@ -92,14 +91,14 @@ public class NewsHistoryCharts {
                init(charts);\r
                charts.setTitle("Adásbejátszók száma típus szerint");\r
                charts.getSeries().getDataLabels().setFormat("{point.name} {point.y} db");\r
-               fill(charts, datas, "count");\r
+               fill(charts, datas, "onair_count");\r
        }\r
 \r
        static public void initTypeDuration(Charts charts, BasicDBObject datas) {\r
                init(charts);\r
                charts.setTitle("Adásbejátszók hossza típus szerint");\r
                charts.getSeries().getDataLabels().addExtraAttr("formatter", new JavaScriptValue("function () { return this.point.name + ' ' + frameToTC(this.y); }"));\r
-               fill(charts, datas, "duration");\r
+               fill(charts, datas, "onair_duration");\r
        }\r
 \r
 }\r
index 8b1372ebb1d8cdf52a21abf422ed972f1f48ebe9..241029fba1cc0ef38686461da2fbb46965c13c08 100644 (file)
@@ -56,7 +56,9 @@ public class NewsHistoryModel {
        @AfterCompose\r
        public void afterCompose(@ContextParam(ContextType.VIEW) Component view) {\r
                Selectors.wireComponents(view, this, false);\r
-               setSelectedDate(new Date());\r
+               Calendar calendar = CalendarUtils.createZeroCalendar();\r
+               calendar.add(Calendar.DAY_OF_YEAR, -1);\r
+               setSelectedDate(calendar.getTime());\r
        }\r
 \r
        private void clearChart(Charts charts) {\r
index be3fc7e1e8b564a9f59d3ec7ae73a0bdf9dc8a5c..1603ecfa545a0da71ada2d44c709da4eb2d1aee1 100644 (file)
@@ -2,17 +2,29 @@ package user.jobengine.zk.model;
 \r
 import java.net.URL;\r
 import java.nio.file.Paths;\r
+import java.util.ArrayList;\r
 import java.util.HashMap;\r
+import java.util.LinkedHashMap;\r
 import java.util.List;\r
 import java.util.Map;\r
 \r
 import org.apache.commons.lang.StringUtils;\r
 import org.apache.logging.log4j.LogManager;\r
 import org.apache.logging.log4j.Logger;\r
+import org.zkoss.bind.ValidationContext;\r
+import org.zkoss.bind.Validator;\r
+import org.zkoss.bind.annotation.AfterCompose;\r
+import org.zkoss.bind.annotation.BindingParam;\r
 import org.zkoss.bind.annotation.Command;\r
+import org.zkoss.bind.annotation.ContextParam;\r
+import org.zkoss.bind.annotation.ContextType;\r
 import org.zkoss.bind.annotation.NotifyChange;\r
+import org.zkoss.zk.ui.Component;\r
 import org.zkoss.zk.ui.Executions;\r
+import org.zkoss.zk.ui.select.Selectors;\r
+import org.zkoss.zk.ui.select.annotation.Wire;\r
 import org.zkoss.zul.Messagebox;\r
+import org.zkoss.zul.Rows;\r
 import org.zkoss.zul.Window;\r
 \r
 import user.commons.StoreUri;\r
@@ -23,28 +35,59 @@ import user.jobengine.db.Media;
 import user.jobengine.db.MediaFile;\r
 import user.jobengine.db.Store;\r
 \r
-public class SearchModel extends BaseModel {\r
+public class SearchModel extends AsyncBaseModel {\r
        private static final Logger logger = LogManager.getLogger();\r
        private static final String MEDIACUBEMEDIA = "mediaCubeMedia";\r
        private static final String PAGES_RETRIEVESELECTOR_ZUL = "/pages/retrieveselector.zul";\r
        private static final String PAGES_MEDIAPLAYER = "/pages/mediaplayer.jsp?mediaurl=";\r
-\r
+       private List<String> typeFilterNames;\r
        private String searchValue = null;\r
        private CachedListModel searchResult = null;\r
        private ArchivedMedia selectedObject = null;\r
-       private boolean newsFeedChecked = true;\r
+       private Validator allFilterCheckedValidator;\r
+       private Map<String, Object> typeFilters;\r
        private boolean allChecked = true;\r
-       private boolean newsRawChecked = true;\r
-       private boolean materialChecked = true;\r
-       private boolean materialRawChecked = true;\r
-       private boolean promoChecked = true;\r
-       private boolean promoRawChecked = true;\r
-       private boolean adChecked = true;\r
-       private boolean adRawChecked = true;\r
-       private boolean recordingChecked = true;\r
-       private boolean otherChecked = true;\r
        private int activePage;\r
        private boolean rowsExpanded = true;\r
+       @Wire\r
+       Rows rows;\r
+\r
+       public SearchModel() {\r
+               typeFilters = new LinkedHashMap<>();\r
+               typeFilters.put("Hír bejátszó", true);\r
+               typeFilters.put("Hír nyersanyag", true);\r
+               typeFilters.put("Műsor", true);\r
+               typeFilters.put("Műsor nyersanyag", true);\r
+               typeFilters.put("Promo", true);\r
+               typeFilters.put("Promo nyersanyag", true);\r
+               typeFilters.put("Reklám", true);\r
+               typeFilters.put("Reklám nyersanyag", true);\r
+               typeFilters.put("Visszarögzített", true);\r
+               typeFilters.put("Egyéb", true);\r
+               typeFilterNames = new ArrayList<>(typeFilters.keySet());\r
+\r
+               allFilterCheckedValidator = new Validator() {\r
+                       @Override\r
+                       public void validate(ValidationContext ctx) {\r
+                               try {\r
+\r
+                                       String label = ctx.getProperty().getProperty();\r
+                                       boolean isChecked = (boolean) ctx.getProperty().getValue();\r
+                                       typeFilters.put(label, isChecked);\r
+                                       //logger.info("{} {}", label, isChecked);\r
+                               } catch (Exception e) {\r
+\r
+                               }\r
+                               updateAllChecked();\r
+                       }\r
+               };\r
+       }\r
+\r
+       @AfterCompose\r
+       public void afterCompose(@ContextParam(ContextType.VIEW) Component view) {\r
+               Selectors.wireComponents(view, this, false);\r
+               Selectors.wireEventListeners(view, this);\r
+       }\r
 \r
        @Command\r
        @NotifyChange({ "activePage", "searchResult", "selectedObject", "hasLowresMediaFile" })\r
@@ -53,7 +96,10 @@ public class SearchModel extends BaseModel {
                        this.selectedObject = null;\r
                        if (StringUtils.isBlank(searchValue) || searchValue.length() < 3)\r
                                throw new Exception("Legalább 3 karakter megadása kötelező!");\r
-                       searchResult = new CachedListModel(searchValue);\r
+\r
+                       List<String> searchFilters = getSelectedFilters();\r
+\r
+                       searchResult = new CachedListModel(searchValue, searchFilters);\r
                } catch (Exception e) {\r
                        Messagebox.show(e.getMessage());\r
                        logger.catching(e);\r
@@ -74,6 +120,10 @@ public class SearchModel extends BaseModel {
                return activePage;\r
        }\r
 \r
+       public Validator getAllFilterCheckedValidator() {\r
+               return allFilterCheckedValidator;\r
+       }\r
+\r
        public boolean getHasLowresMediaFile() {\r
                boolean ret = false;\r
                Media media = getMedia();\r
@@ -134,6 +184,21 @@ public class SearchModel extends BaseModel {
                return searchValue;\r
        }\r
 \r
+       private List<String> getSelectedFilters() {\r
+               List<String> result = null;\r
+               if (!allChecked) {\r
+                       for (String label : typeFilters.keySet()) {\r
+                               boolean isChecked = (boolean) typeFilters.get(label);\r
+                               if (!isChecked)\r
+                                       continue;\r
+                               if (result == null)\r
+                                       result = new ArrayList<>();\r
+                               result.add(label);\r
+                       }\r
+               }\r
+               return result;\r
+       }\r
+\r
        public ArchivedMedia getSelectedObject() {\r
                return selectedObject;\r
        }\r
@@ -152,112 +217,52 @@ public class SearchModel extends BaseModel {
                return ret;\r
        }\r
 \r
-       public boolean isAdChecked() {\r
-               return adChecked;\r
+       public List<String> getTypeFilterNames() {\r
+               return typeFilterNames;\r
        }\r
 \r
-       public boolean isAdRawChecked() {\r
-               return adRawChecked;\r
+       public Map<String, Object> getTypeFilters() {\r
+               return typeFilters;\r
        }\r
 \r
        public boolean isAllChecked() {\r
                return allChecked;\r
        }\r
 \r
-       public boolean isMaterialChecked() {\r
-               return materialChecked;\r
-       }\r
-\r
-       public boolean isMaterialRawChecked() {\r
-               return materialRawChecked;\r
-       }\r
-\r
-       public boolean isNewsFeedChecked() {\r
-               return newsFeedChecked;\r
-       }\r
-\r
-       public boolean isNewsRawChecked() {\r
-               return newsRawChecked;\r
-       }\r
-\r
-       public boolean isOtherChecked() {\r
-               return otherChecked;\r
-       }\r
-\r
-       public boolean isPromoChecked() {\r
-               return promoChecked;\r
-       }\r
-\r
-       public boolean isPromoRawChecked() {\r
-               return promoRawChecked;\r
-       }\r
-\r
-       public boolean isRecordingChecked() {\r
-               return recordingChecked;\r
-       }\r
-\r
        public boolean isRowsExpanded() {\r
                return rowsExpanded;\r
        }\r
 \r
-       public void setActivePage(int activePage) {\r
-               this.activePage = activePage;\r
-       }\r
-\r
-       public void setAdChecked(boolean adChecked) {\r
-               this.adChecked = adChecked;\r
-       }\r
-\r
-       public void setAdRawChecked(boolean adRawChecked) {\r
-               this.adRawChecked = adRawChecked;\r
-       }\r
-\r
-       @NotifyChange({ "newsFeedChecked", "newsRawChecked", "materialChecked", "materialRawChecked", "promoChecked", "promoRawChecked", "adChecked",\r
-                       "adRawChecked", "recordingChecked", "otherChecked" })\r
-       public void setAllChecked(boolean allFeedChecked) {\r
-               this.allChecked = allFeedChecked;\r
-               newsFeedChecked = allChecked;\r
-               newsRawChecked = allChecked;\r
-               materialChecked = allChecked;\r
-               materialRawChecked = allChecked;\r
-               promoChecked = allChecked;\r
-               promoRawChecked = allChecked;\r
-               adChecked = allChecked;\r
-               adRawChecked = allChecked;\r
-               recordingChecked = allChecked;\r
-               otherChecked = allChecked;\r
-       }\r
-\r
-       public void setMaterialChecked(boolean materialChecked) {\r
-               this.materialChecked = materialChecked;\r
-       }\r
-\r
-       public void setMaterialRawChecked(boolean materialRawChecked) {\r
-               this.materialRawChecked = materialRawChecked;\r
-       }\r
-\r
-       public void setNewsFeedChecked(boolean newsFeedChecked) {\r
-               this.newsFeedChecked = newsFeedChecked;\r
+       @Command\r
+       public void onPaging() {\r
+               //              if (rows != null)\r
+               //                      Clients.scrollIntoView(rows);\r
        }\r
 \r
-       public void setNewsRawChecked(boolean newsRawChecked) {\r
-               this.newsRawChecked = newsRawChecked;\r
+       @NotifyChange({ "selectedObject", "hasLowresMediaFile", "hasTSMMediaFile", "lowresMediaFilePath" })\r
+       public void selectedMediaArchive(ArchivedMedia selectedObject) {\r
+               this.selectedObject = selectedObject;\r
        }\r
 \r
-       public void setOtherChecked(boolean otherChecked) {\r
-               this.otherChecked = otherChecked;\r
+       @Command\r
+       @NotifyChange({ "selectedObject", "hasLowresMediaFile", "hasTSMMediaFile", "lowresMediaFilePath" })\r
+       public void selectMediaArchive(@BindingParam("selectedObject") ArchivedMedia selectedObject) {\r
+               this.selectedObject = selectedObject;\r
        }\r
 \r
-       public void setPromoChecked(boolean promoChecked) {\r
-               this.promoChecked = promoChecked;\r
+       public void setActivePage(int activePage) {\r
+               this.activePage = activePage;\r
        }\r
 \r
-       public void setPromoRawChecked(boolean promoRawChecked) {\r
-               this.promoRawChecked = promoRawChecked;\r
+       @NotifyChange("*")\r
+       public void setAllChecked(boolean allChecked) {\r
+               this.allChecked = allChecked;\r
+               for (String key : typeFilters.keySet())\r
+                       typeFilters.put(key, allChecked);\r
        }\r
 \r
-       public void setRecordingChecked(boolean recordingChecked) {\r
-               this.recordingChecked = recordingChecked;\r
+       public void setAllFilterCheckedValidator(Validator allFilterCheckedValidator) {\r
+               this.allFilterCheckedValidator = allFilterCheckedValidator;\r
        }\r
 \r
        public void setRowsExpanded(boolean rowsExpanded) {\r
@@ -273,4 +278,26 @@ public class SearchModel extends BaseModel {
                this.selectedObject = selectedObject;\r
        }\r
 \r
+       public void setTypeFilterNames(List<String> typeFilterNames) {\r
+               this.typeFilterNames = typeFilterNames;\r
+       }\r
+\r
+       public void setTypeFilters(Map<String, Object> typeFilters) {\r
+               this.typeFilters = typeFilters;\r
+       }\r
+\r
+       public void updateAllChecked() {\r
+               final boolean[] check = { true };\r
+               for (String key : typeFilters.keySet()) {\r
+                       if (!(boolean) typeFilters.get(key)) {\r
+                               check[0] = false;\r
+                               break;\r
+                       }\r
+               }\r
+\r
+               registerTask(() -> {\r
+                       allChecked = check[0];\r
+                       NotifyChange("allChecked");\r
+               });\r
+       }\r
 }\r
index 95bbcd393c9db360bd564a4ee33d30a824932d93..1bcdcfea4bdfbe4b82f78227d4b45c43825ed120 100644 (file)
@@ -4,6 +4,8 @@ import java.util.ArrayList;
 import java.util.Arrays;\r
 import java.util.List;\r
 \r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
 import org.zkoss.bind.annotation.AfterCompose;\r
 import org.zkoss.bind.annotation.Command;\r
 import org.zkoss.bind.annotation.ContextParam;\r
@@ -13,16 +15,26 @@ import org.zkoss.chart.Point;
 import org.zkoss.chart.Series;\r
 import org.zkoss.zk.ui.Component;\r
 import org.zkoss.zk.ui.Executions;\r
+import org.zkoss.zk.ui.event.Event;\r
 import org.zkoss.zk.ui.select.Selectors;\r
+import org.zkoss.zk.ui.select.annotation.Listen;\r
 import org.zkoss.zk.ui.select.annotation.Wire;\r
+import org.zkoss.zk.ui.util.Clients;\r
+import org.zkoss.zul.Grid;\r
+import org.zkoss.zul.Row;\r
+import org.zkoss.zul.Rows;\r
 import org.zkoss.zul.Window;\r
 \r
 import com.ibm.nosql.json.JSONUtil;\r
 import com.ibm.nosql.json.api.BasicDBObject;\r
 \r
 public class StatisticsDetailsModel extends BaseModel {\r
+       private static final Logger logger = LogManager.getLogger();\r
+\r
        @Wire("#wnd")\r
        private Window wnd;\r
+       @Wire("#rows")\r
+       private Rows rows;\r
        private List<BasicDBObject> events;\r
        private List<String> columnList = Arrays.asList("Touched", "Started", "Finished", "Tag", "Successful", "UserName", "Source", "Destination");\r
        private BasicDBObject selectedEvent;\r
@@ -30,6 +42,8 @@ public class StatisticsDetailsModel extends BaseModel {
        @AfterCompose\r
        public void afterCompose(@ContextParam(ContextType.VIEW) Component view) {\r
                Selectors.wireComponents(view, this, false);\r
+               Selectors.wireEventListeners(view, this);\r
+\r
                Series series = (Series) Executions.getCurrent().getArg().get("series");\r
                wnd.setTitle(series.getName());\r
                Point selectedPoint = (Point) Executions.getCurrent().getArg().get("point");\r
@@ -66,6 +80,29 @@ public class StatisticsDetailsModel extends BaseModel {
                return event.equals(selectedEvent);\r
        }\r
 \r
+       @Listen("onAfterRender = #grid")\r
+       public void onAfterRender(Event event) {\r
+               Grid grid = (Grid) event.getTarget();\r
+               grid.renderAll();\r
+\r
+               List<Component> children = rows.getChildren();\r
+               for (Component child : children) {\r
+                       Row row = (Row) child;\r
+                       if (row == null)\r
+                               continue;\r
+                       BasicDBObject value = row.getValue();\r
+                       if (value == null)\r
+                               continue;\r
+                       logger.info("{}", value);\r
+                       if (isSelected(value)) {\r
+                               Clients.scrollIntoView(child);\r
+                               break;\r
+                       }\r
+\r
+               }\r
+\r
+       }\r
+\r
        public void setColumnList(List<String> columnList) {\r
                this.columnList = columnList;\r
        }\r
index aa21702b14848dcdaa6f0fa0b44b6dd71ff26868..6171dd5f924ea071eb30cbd170eeed452f302e08 100644 (file)
@@ -1,9 +1,8 @@
 package user.jobengine.zk.model;\r
 \r
-import java.util.ArrayList;\r
 import java.util.Calendar;\r
 import java.util.Date;\r
-import java.util.HashMap;\r
+import java.util.LinkedHashMap;\r
 import java.util.List;\r
 import java.util.Locale;\r
 import java.util.Map;\r
@@ -13,17 +12,18 @@ import org.apache.logging.log4j.Logger;
 import org.zkoss.bind.annotation.AfterCompose;\r
 import org.zkoss.bind.annotation.ContextParam;\r
 import org.zkoss.bind.annotation.ContextType;\r
-import org.zkoss.chart.AxisLabels;\r
 import org.zkoss.chart.Charts;\r
 import org.zkoss.chart.ChartsEvent;\r
 import org.zkoss.chart.Color;\r
 import org.zkoss.chart.Lang;\r
+import org.zkoss.chart.Legend;\r
 import org.zkoss.chart.Marker;\r
 import org.zkoss.chart.Options;\r
 import org.zkoss.chart.Point;\r
 import org.zkoss.chart.Series;\r
 import org.zkoss.chart.XAxis;\r
 import org.zkoss.chart.YAxis;\r
+import org.zkoss.chart.plotOptions.ColumnPlotOptions;\r
 import org.zkoss.chart.plotOptions.PlotOptions;\r
 import org.zkoss.chart.plotOptions.SplinePlotOptions;\r
 import org.zkoss.json.JavaScriptValue;\r
@@ -46,12 +46,14 @@ import user.jobengine.zk.model.MetadataTypeDetector.MetadataType;
 public class StatisticsModel {\r
        private static final Logger logger = LogManager.getLogger();\r
        private static final int XCOUNT = 60 * 24;\r
-       private static Map<String, Color> colors = new HashMap<>();\r
+       private static Map<String, Color> colors = new LinkedHashMap<>();\r
        static {\r
-               colors.put("INGEST", new Color("red"));\r
-               colors.put("Betöltés", new Color("green"));\r
                colors.put("Adáskész", new Color("blue"));\r
                colors.put("Archiválás", new Color("orange"));\r
+               colors.put("Betöltés", new Color("green"));\r
+               colors.put("Nexio", new Color("red"));\r
+               colors.put("Online", new Color("yellow"));\r
+               colors.put("PLayout", new Color("lightblue"));\r
                colors.put("Újravágás", new Color("brown"));\r
        }\r
 \r
@@ -59,13 +61,27 @@ public class StatisticsModel {
        private Date selectedDate;\r
        private int selectedType;\r
 \r
-       @Wire\r
+       @Wire("#chart")\r
        Charts chart;\r
+       @Wire("#legendChart")\r
+       Charts legendChart;\r
 \r
        public StatisticsModel() {\r
                this.itemManager = JobEngine.getStaticItemManager();\r
        }\r
 \r
+       private Series addLegendSeries(int index, String name, Color color, boolean show) {\r
+               Series result = legendChart.getSeries(index);\r
+               result.setColor(color);\r
+               //result.getPlotOptions().setShowInLegend(show);\r
+               result.setName(name);\r
+               //marker.setLineColor(color);\r
+               //marker.setSymbol("square");\r
+               //marker.setRadius(3);\r
+               //marker.setLineWidth(0);\r
+               return result;\r
+       }\r
+\r
        private void addPoint(Series series, int x, int y, String data, Color color) {\r
                Point p = new Point(x, y);\r
                p.setName(data);\r
@@ -91,9 +107,19 @@ public class StatisticsModel {
                data.put("Tag", action.getTag());\r
                data.put("Successful", action.isSuccessful());\r
                data.put("UserName", action.getUserName());\r
+               data.put("Color", color == null ? "black" : color.stringValue());\r
                addPoint(series, x, y, data.toString(), color);\r
        }\r
 \r
+       //      private void clearChart() {\r
+       //              int size = chart.getSeriesSize();\r
+       //              for (int i = 0; i < size; i++)\r
+       //                      chart.getSeries(i).setData(new ArrayList<Integer>());\r
+       //              size = legendChart.getSeriesSize();\r
+       //              for (int i = 0; i < size; i++)\r
+       //                      legendChart.getSeries(i).setData(new ArrayList<Integer>());\r
+       //      }\r
+\r
        @AfterCompose\r
        public void afterCompose(@ContextParam(ContextType.VIEW) Component view) {\r
                Selectors.wireComponents(view, this, false);\r
@@ -101,17 +127,26 @@ public class StatisticsModel {
                setSelectedDate(new Date());\r
        }\r
 \r
-       private void clearChart() {\r
-               int size = chart.getSeriesSize();\r
-               for (int i = 0; i < size; i++)\r
-                       chart.getSeries(i).setData(new ArrayList<Integer>());\r
+       private void clearChart(Charts charts) {\r
+               int seriesSize = charts.getSeriesSize();\r
+               for (int i = 0; i < seriesSize; i++) {\r
+                       charts.getSeries(0).remove();\r
+               }\r
+\r
+               int axisSize = charts.getyAxisSize();\r
+               for (int i = 0; i < axisSize; i++) {\r
+                       charts.getYAxis(0).remove();\r
+               }\r
+\r
+               charts.setTitle("");\r
+               charts.setSubtitle("");\r
        }\r
 \r
        private void configureChart() {\r
+\r
                Options options = chart.getOptions();\r
                if (options == null)\r
                        options = new Options();\r
-\r
                Lang lang = options.getLang();\r
                if (lang == null)\r
                        lang = new Lang();\r
@@ -123,12 +158,15 @@ public class StatisticsModel {
                lang.setResetZoom("Nagyítás vége");\r
                chart.getTooltip().setEnabled(false);\r
                chart.getExporting().setEnabled(false);\r
+               chart.setTitle("");\r
 \r
-               chart.setTitle("Anyagok élettörténete");\r
-               chart.setSubtitle(CalendarUtils.toDateWithDayString(CalendarUtils.createCalendar(selectedDate), new Locale("hu")));\r
+               //              chart.setTheme(Theme.GRAY);\r
+               //chart.setSubtitle(CalendarUtils.toDateWithDayString(CalendarUtils.createCalendar(selectedDate), new Locale("hu")));\r
                chart.getLegend().setEnabled(false);\r
+\r
                PlotOptions plotOptions = chart.getPlotOptions();\r
                plotOptions.getSeries().setAllowPointSelect(true);\r
+\r
                SplinePlotOptions soptions = plotOptions.getSpline();\r
                soptions.setLineWidth(0);\r
                soptions.setAnimation(false);\r
@@ -141,6 +179,46 @@ public class StatisticsModel {
                marker.setSymbol("square");\r
        }\r
 \r
+       private void configureLegend() {\r
+               Options options = legendChart.getOptions();\r
+               if (options == null)\r
+                       options = new Options();\r
+               Lang lang = options.getLang();\r
+               if (lang == null)\r
+                       lang = new Lang();\r
+\r
+               options.setLang(lang);\r
+               legendChart.setOptions(options);\r
+               lang.setNoData("");\r
+\r
+               legendChart.setTitle("Anyagok élettörténete");\r
+               legendChart.setSubtitle(CalendarUtils.toDateWithDayString(CalendarUtils.createCalendar(selectedDate), new Locale("hu")));\r
+               //legendChart.setShowAxes(false);\r
+               legendChart.getXAxis().setShowEmpty(false);\r
+               legendChart.getXAxis().setLineWidth(0);\r
+               legendChart.getYAxis().setTitle("");\r
+               legendChart.getYAxis().setShowEmpty(false);\r
+\r
+               Legend legend = legendChart.getLegend();\r
+               legend.setEnabled(true);\r
+               legend.setVerticalAlign("bottom");\r
+               legend.setAlign("right");\r
+               legend.setBorderWidth(0);\r
+\r
+               legendChart.getTooltip().setEnabled(false);\r
+               legendChart.getExporting().setEnabled(false);\r
+               ColumnPlotOptions plot = legendChart.getPlotOptions().getColumn();\r
+               plot.setAnimation(false);\r
+               plot.setEnableMouseTracking(false);\r
+               plot.setAllowPointSelect(true);\r
+\r
+               int index = 0;\r
+               for (String name : colors.keySet()) {\r
+                       addLegendSeries(index++, name, colors.get(name), true);\r
+               }\r
+\r
+       }\r
+\r
        private int fillData(List<WorkflowAction> actions) {\r
                int result = 0;\r
                String lastHouseId = null;\r
@@ -177,6 +255,11 @@ public class StatisticsModel {
                return selectedType;\r
        }\r
 \r
+       @Listen("onPlotLegendItemClick = #legendChart")\r
+       public void onPlotLegendItemClick(ChartsEvent event) {\r
+               logger.info("{} {} {}", event.isChecked(), event.getSeries(), event.getSeries());\r
+       }\r
+\r
        @Listen("onPlotSelect = #chart")\r
        public void onPlotSelect(ChartsEvent event) {\r
                Point point = event.getPoint();\r
@@ -198,13 +281,20 @@ public class StatisticsModel {
        }\r
 \r
        private void setupXAxis() {\r
-               XAxis xAxis = chart.getXAxis();\r
-               xAxis.setTickInterval(30);\r
-               xAxis.setMin(0);\r
-               xAxis.setMax(XCOUNT);\r
-               AxisLabels xLabels = xAxis.getLabels();\r
-               xLabels.setRotation(-45);\r
-               xAxis.getLabels().addExtraAttr("formatter", new JavaScriptValue("function () { return statisticsXValue(this.value); }"));\r
+               XAxis xAxisDown = chart.getXAxis(0);\r
+               xAxisDown.setTickInterval(30);\r
+               xAxisDown.setMin(0);\r
+               xAxisDown.setMax(XCOUNT);\r
+               xAxisDown.getLabels().setRotation(-70);\r
+               xAxisDown.getLabels().addExtraAttr("formatter", new JavaScriptValue("function () { return statisticsXValue(this.value); }"));\r
+\r
+               XAxis xAxisUp = chart.getXAxis(1);\r
+               xAxisUp.setTickInterval(30);\r
+               xAxisUp.setMin(0);\r
+               xAxisUp.setMax(XCOUNT);\r
+               xAxisUp.getLabels().setRotation(-70);\r
+               xAxisUp.getLabels().addExtraAttr("formatter", new JavaScriptValue("function () { return statisticsXValue(this.value); }"));\r
+               xAxisUp.setOpposite(true);\r
        }\r
 \r
        private void setupYAxis(int distinctCount) {\r
@@ -218,7 +308,7 @@ public class StatisticsModel {
                } else {\r
                        yAxis.setGridLineWidth(1);\r
                        //Solid, ShortDash, ShortDot, ShortDashDot, ShortDashDotDot, Dot , Dash, LongDash, DashDot, LongDashDot, and LongDashDotDot\r
-                       yAxis.setGridLineDashStyle("LongDashDot");\r
+                       yAxis.setGridLineDashStyle("Solid");\r
                        yAxis.setGridLineColor(new Color("lightgray"));\r
                }\r
 \r
@@ -226,8 +316,12 @@ public class StatisticsModel {
        }\r
 \r
        public void showChart() {\r
-               clearChart();\r
+               clearChart(legendChart);\r
+               configureLegend();\r
+\r
+               clearChart(chart);\r
                configureChart();\r
+\r
                setupXAxis();\r
                List<WorkflowAction> actions = itemManager.getWorkflowActions(selectedDate);\r
                if (actions == null || actions.size() == 0) {\r