{"id":88275,"date":"2024-12-14T23:12:21","date_gmt":"2024-12-14T19:42:21","guid":{"rendered":"https:\/\/nabfollower.com\/blog\/dev-11-aei\/"},"modified":"2024-12-14T23:12:21","modified_gmt":"2024-12-14T19:42:21","slug":"dev-11-aei","status":"publish","type":"post","link":"https:\/\/nabfollower.com\/blog\/dev-11-aei\/","title":{"rendered":"\u062a\u0648\u0633\u0639\u0647 \u062f\u0647\u0646\u062f\u0647 11"},"content":{"rendered":"<p>Summarize this content to 400 words in Persian Lang <\/p>\n<p>import java.io.*;<br \/>\nimport java.util.*;<br \/>\nimport java.util.regex.*;<br \/>\nimport java.util.stream.Collectors;<\/p>\n<p>public class SQLLogAnalyzer {<br \/>\n    private static final Pattern LOG_PATTERN = Pattern.compile(&#8220;.*?\\\\[((?:ACTIVE|STUCK|Async-Pool-\\\\d+-thread-\\\\d+|.*?))\\\\].*?(?:ExecuteThread:\\\\s+'(\\\\d+)&#8217;|).*?((?i)SELECT\\\\s+.*)&#8221;);<br \/>\n    private final Map&lt;String, QueryStats&gt; queryDistribution;<br \/>\n    private final Set&lt;String&gt; knownStates;<\/p>\n<p>    public SQLLogAnalyzer() {<br \/>\n        this.queryDistribution = new HashMap&lt;&gt;();<br \/>\n        this.knownStates = new HashSet&lt;&gt;();<br \/>\n    }<\/p>\n<p>    private static String repeatString(String str, int count) {<br \/>\n        StringBuilder sb = new StringBuilder();<br \/>\n        for (int i = 0; i &lt; count; i++) {<br \/>\n            sb.append(str);<br \/>\n        }<br \/>\n        return sb.toString();<br \/>\n    }<\/p>\n<p>    public static class ThreadInfo {<br \/>\n        private final String threadId;<br \/>\n        private int occurrences;<br \/>\n        private final Set&lt;Integer&gt; lineNumbers;<\/p>\n<p>        public ThreadInfo(String threadId) {<br \/>\n            this.threadId = threadId;<br \/>\n            this.occurrences = 0;<br \/>\n            this.lineNumbers = new HashSet&lt;&gt;();<br \/>\n        }<\/p>\n<p>        public void addOccurrence(int lineNumber) {<br \/>\n            occurrences++;<br \/>\n            lineNumbers.add(lineNumber);<br \/>\n        }<\/p>\n<p>        @Override<br \/>\n        public String toString() {<br \/>\n            return String.format(&#8220;%d occurrences, Lines: %s&#8221;,<br \/>\n                occurrences,<br \/>\n                lineNumbers.stream()<br \/>\n                    .sorted()<br \/>\n                    .map(String::valueOf)<br \/>\n                    .collect(Collectors.joining(&#8220;, &#8220;))<br \/>\n            );<br \/>\n        }<br \/>\n    }<\/p>\n<p>    public static class StateInfo {<br \/>\n        private final Map&lt;String, ThreadInfo&gt; threadStats;<br \/>\n        private int totalOccurrences;<\/p>\n<p>        public StateInfo() {<br \/>\n            this.threadStats = new HashMap&lt;&gt;();<br \/>\n            this.totalOccurrences = 0;<br \/>\n        }<\/p>\n<p>        public void addOccurrence(String threadId, int lineNumber) {<br \/>\n            threadStats.computeIfAbsent(threadId, ThreadInfo::new)<br \/>\n                      .addOccurrence(lineNumber);<br \/>\n            totalOccurrences++;<br \/>\n        }<\/p>\n<p>        public int getTotalOccurrences() {<br \/>\n            return totalOccurrences;<br \/>\n        }<\/p>\n<p>        public Collection&lt;ThreadInfo&gt; getThreadStats() {<br \/>\n            return threadStats.values();<br \/>\n        }<br \/>\n    }<\/p>\n<p>    public static class QueryStats {<br \/>\n        private final String originalQuery;<br \/>\n        private final String normalizedQuery;<br \/>\n        private int occurrences;<br \/>\n        private final Map&lt;String, StateInfo&gt; stateStats;<\/p>\n<p>        public QueryStats(String query) {<br \/>\n            this.originalQuery = query.trim();<br \/>\n            this.normalizedQuery = normalizeQuery(query);<br \/>\n            this.occurrences = 0;<br \/>\n            this.stateStats = new HashMap&lt;&gt;();<br \/>\n        }<\/p>\n<p>        private static String normalizeQuery(String query) {<br \/>\n            return query.replaceAll(&#8220;\\\\s+&#8221;, &#8221; &#8220;).trim();<br \/>\n        }<\/p>\n<p>        public void addOccurrence(String threadId, String state, int lineNumber) {<br \/>\n            occurrences++;<br \/>\n            \/\/ Normalize state names<br \/>\n            if (state.startsWith(&#8220;Async-Pool&#8221;)) {<br \/>\n                state = state; \/\/ Keep the full async pool thread name<br \/>\n            } else {<br \/>\n                state = state.equals(&#8220;STUCK&#8221;) ? &#8220;[STUCK]&#8221; : &#8220;[ACTIVE]&#8221;;<br \/>\n            }<br \/>\n            stateStats.computeIfAbsent(state, k -&gt; new StateInfo())<br \/>\n                     .addOccurrence(threadId, lineNumber);<br \/>\n        }<\/p>\n<p>        public String toFormattedString() {<br \/>\n            StringBuilder sb = new StringBuilder();<br \/>\n            \/\/ Format query to avoid line breaks<br \/>\n            String formattedQuery = &#8220;Query: &#8221; + originalQuery.replaceAll(&#8220;\\\\s+&#8221;, &#8221; &#8220;);<br \/>\n            sb.append(formattedQuery).append(&#8220;\\n&#8221;);<br \/>\n            sb.append(String.format(&#8220;Total Occurrences: %d%n&#8221;, occurrences));<\/p>\n<p>            \/\/ State-wise breakdown<br \/>\n            sb.append(&#8220;State Distribution:\\n&#8221;);<br \/>\n            stateStats.entrySet().stream()<br \/>\n                .sorted(Map.Entry.&lt;String, StateInfo&gt;comparingByKey())<br \/>\n                .forEach(entry -&gt; {<br \/>\n                    String state = entry.getKey();<br \/>\n                    StateInfo stateInfo = entry.getValue();<br \/>\n                    sb.append(String.format(&#8221;  %s (Total: %d): %s%n&#8221;,<br \/>\n                        state,<br \/>\n                        stateInfo.getTotalOccurrences(),<br \/>\n                        stateInfo.getThreadStats().iterator().next().toString()<br \/>\n                    ));<br \/>\n                });<\/p>\n<p>            return sb.toString();<br \/>\n        }<\/p>\n<p>        public String getNormalizedQuery() {<br \/>\n            return normalizedQuery;<br \/>\n        }<br \/>\n    }<\/p>\n<p>    public void analyzeLogs(String filePath) throws IOException {<br \/>\n        try (BufferedReader reader = new BufferedReader(new FileReader(filePath))) {<br \/>\n            String line;<br \/>\n            int lineNumber = 0;<\/p>\n<p>            while ((line = reader.readLine()) != null) {<br \/>\n                lineNumber++;<br \/>\n                processLine(line, lineNumber);<br \/>\n            }<br \/>\n        }<br \/>\n    }<\/p>\n<p>    private void processLine(String line, int lineNumber) {<br \/>\n        Matcher matcher = LOG_PATTERN.matcher(line);<br \/>\n        if (matcher.find()) {<br \/>\n            String state = matcher.group(1);<br \/>\n            knownStates.add(state);<br \/>\n            String threadId = matcher.group(2) != null ? matcher.group(2) : &#8220;N\/A&#8221;;<br \/>\n            String sqlStatement = matcher.group(3).trim();<\/p>\n<p>            String normalizedSQL = sqlStatement.replaceAll(&#8220;\\\\s+&#8221;, &#8221; &#8220;).trim();<br \/>\n            queryDistribution<br \/>\n                .computeIfAbsent(normalizedSQL, query -&gt; new QueryStats(sqlStatement))<br \/>\n                .addOccurrence(threadId, state, lineNumber);<br \/>\n        }<br \/>\n    }<\/p>\n<p>    public void writeAnalysisToFile(String outputPath) throws IOException {<br \/>\n        try (PrintWriter writer = new PrintWriter(new FileWriter(outputPath))) {<br \/>\n            writer.println(&#8220;=== SQL Query Analysis ===\\n&#8221;);<\/p>\n<p>            queryDistribution.values().stream()<br \/>\n                .sorted((a, b) -&gt; Integer.compare(b.occurrences, a.occurrences))<br \/>\n                .forEach(stats -&gt; {<br \/>\n                    writer.println(stats.toFormattedString());<br \/>\n                    writer.println(repeatString(&#8220;-&#8220;, 80) + &#8220;\\n&#8221;);<br \/>\n                });<\/p>\n<p>            \/\/ Write summary statistics<br \/>\n            writer.println(&#8220;=== Summary Statistics ===&#8221;);<br \/>\n            writer.println(&#8220;Total unique queries: &#8221; + queryDistribution.size());<\/p>\n<p>            writer.println(&#8220;\\nThread states found: &#8221; +<br \/>\n                knownStates.stream()<br \/>\n                    .sorted()<br \/>\n                    .collect(Collectors.joining(&#8220;, &#8220;)));<\/p>\n<p>            Map&lt;String, Integer&gt; totalStateDistribution = new HashMap&lt;&gt;();<br \/>\n            queryDistribution.values().forEach(stats -&gt;<br \/>\n                stats.stateStats.forEach((state, stateInfo) -&gt;<br \/>\n                    totalStateDistribution.merge(state, stateInfo.getTotalOccurrences(), Integer::sum))<br \/>\n            );<\/p>\n<p>            writer.println(&#8220;\\nOverall state distribution:&#8221;);<br \/>\n            totalStateDistribution.entrySet().stream()<br \/>\n                .sorted(Map.Entry.&lt;String, Integer&gt;comparingByValue().reversed())<br \/>\n                .forEach(entry -&gt;<br \/>\n                    writer.printf(&#8221;  %s: %d occurrences%n&#8221;, entry.getKey(), entry.getValue())<br \/>\n                );<br \/>\n        }<br \/>\n    }<\/p>\n<p>    public static void main(String[] args) {<br \/>\n        if (args.length != 2) {<br \/>\n            System.out.println(&#8220;Usage: java SQLLogAnalyzer &lt;log-file-path&gt; &lt;output-file-path&gt;&#8221;);<br \/>\n            return;<br \/>\n        }<\/p>\n<p>        SQLLogAnalyzer analyzer = new SQLLogAnalyzer();<br \/>\n        try {<br \/>\n            analyzer.analyzeLogs(args[0]);<br \/>\n            analyzer.writeAnalysisToFile(args[1]);<br \/>\n            System.out.println(&#8220;Analysis has been written to: &#8221; + args[1]);<br \/>\n        } catch (IOException e) {<br \/>\n            System.err.println(&#8220;Error processing files: &#8221; + e.getMessage());<br \/>\n            e.printStackTrace();<br \/>\n        }<br \/>\n    }<br \/>\n}<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>\nimport java.io.*;\nimport java.util.*;\nimport java.util.regex.*;\nimport java.util.stream.Collectors;\n\npublic class SQLLogAnalyzer {\n    private static final Pattern LOG_PATTERN = Pattern.compile(\".*?\\\\[((?:ACTIVE|STUCK|Async-Pool-\\\\d+-thread-\\\\d+|.*?))\\\\].*?(?:ExecuteThread:\\\\s+'(\\\\d+)'|).*?((?i)SELECT\\\\s+.*)\");\n    private final Map&lt;String, QueryStats&gt; queryDistribution;\n    private final Set&lt;String&gt; knownStates;\n\n    public SQLLogAnalyzer() {\n        this.queryDistribution = new HashMap&lt;&gt;();\n        this.knownStates = new HashSet&lt;&gt;();\n    }\n\n    private static String repeatString(String str, int count) {\n        StringBuilder sb = new StringBuilder();\n        for (int i = 0; i &lt; count; i++) {\n            sb.append(str);\n        }\n        return sb.toString();\n    }\n\n    public static class ThreadInfo {\n        private final String threadId;\n        private int occurrences;\n        private final Set&lt;Integer&gt; lineNumbers;\n\n        public ThreadInfo(String threadId) {\n            this.threadId = threadId;\n            this.occurrences = 0;\n            this.lineNumbers = new HashSet&lt;&gt;();\n        }\n\n        public void addOccurrence(int lineNumber) {\n            occurrences++;\n            lineNumbers.add(lineNumber);\n        }\n\n        @Override\n        public String toString() {\n            return String.format(\"%d occurrences, Lines: %s\", \n                occurrences,\n                lineNumbers.stream()\n                    .sorted()\n                    .map(String::valueOf)\n                    .collect(Collectors.joining(\", \"))\n            );\n        }\n    }\n\n    public static class StateInfo {\n        private final Map&lt;String, ThreadInfo&gt; threadStats;\n        private int totalOccurrences;\n\n        public StateInfo() {\n            this.threadStats = new HashMap&lt;&gt;();\n            this.totalOccurrences = 0;\n        }\n\n        public void addOccurrence(String threadId, int lineNumber) {\n            threadStats.computeIfAbsent(threadId, ThreadInfo::new)\n                      .addOccurrence(lineNumber);\n            totalOccurrences++;\n        }\n\n        public int getTotalOccurrences() {\n            return totalOccurrences;\n        }\n\n        public Collection&lt;ThreadInfo&gt; getThreadStats() {\n            return threadStats.values();\n        }\n    }\n\n    public static class QueryStats {\n        private final String originalQuery;\n        private final String normalizedQuery;\n        private int occurrences;\n        private final Map&lt;String, StateInfo&gt; stateStats;\n\n        public QueryStats(String query) {\n            this.originalQuery = query.trim();\n            this.normalizedQuery = normalizeQuery(query);\n            this.occurrences = 0;\n            this.stateStats = new HashMap&lt;&gt;();\n        }\n\n        private static String normalizeQuery(String query) {\n            return query.replaceAll(\"\\\\s+\", \" \").trim();\n        }\n\n        public void addOccurrence(String threadId, String state, int lineNumber) {\n            occurrences++;\n            \/\/ Normalize state names\n            if (state.startsWith(\"Async-Pool\")) {\n                state = state; \/\/ Keep the full async pool thread name\n            } else {\n                state = state.equals(\"STUCK\") ? \"[STUCK]\" : \"[ACTIVE]\";\n            }\n            stateStats.computeIfAbsent(state, k -&gt; new StateInfo())\n                     .addOccurrence(threadId, lineNumber);\n        }\n\n        public String toFormattedString() {\n            StringBuilder sb = new StringBuilder();\n            \/\/ Format query to avoid line breaks\n            String formattedQuery = \"Query: \" + originalQuery.replaceAll(\"\\\\s+\", \" \");\n            sb.append(formattedQuery).append(\"\\n\");\n            sb.append(String.format(\"Total Occurrences: %d%n\", occurrences));\n\n            \/\/ State-wise breakdown\n            sb.append(\"State Distribution:\\n\");\n            stateStats.entrySet().stream()\n                .sorted(Map.Entry.&lt;String, StateInfo&gt;comparingByKey())\n                .forEach(entry -&gt; {\n                    String state = entry.getKey();\n                    StateInfo stateInfo = entry.getValue();\n                    sb.append(String.format(\"  %s (Total: %d): %s%n\", \n                        state,\n                        stateInfo.getTotalOccurrences(),\n                        stateInfo.getThreadStats().iterator().next().toString()\n                    ));\n                });\n\n            return sb.toString();\n        }\n\n        public String getNormalizedQuery() {\n            return normalizedQuery;\n        }\n    }\n\n    public void analyzeLogs(String filePath) throws IOException {\n        try (BufferedReader reader = new BufferedReader(new FileReader(filePath))) {\n            String line;\n            int lineNumber = 0;\n\n            while ((line = reader.readLine()) != null) {\n                lineNumber++;\n                processLine(line, lineNumber);\n            }\n        }\n    }\n\n    private void processLine(String line, int lineNumber) {\n        Matcher matcher = LOG_PATTERN.matcher(line);\n        if (matcher.find()) {\n            String state = matcher.group(1);\n            knownStates.add(state);\n            String threadId = matcher.group(2) != null ? matcher.group(2) : \"N\/A\";\n            String sqlStatement = matcher.group(3).trim();\n\n            String normalizedSQL = sqlStatement.replaceAll(\"\\\\s+\", \" \").trim();\n            queryDistribution\n                .computeIfAbsent(normalizedSQL, query -&gt; new QueryStats(sqlStatement))\n                .addOccurrence(threadId, state, lineNumber);\n        }\n    }\n\n    public void writeAnalysisToFile(String outputPath) throws IOException {\n        try (PrintWriter writer = new PrintWriter(new FileWriter(outputPath))) {\n            writer.println(\"=== SQL Query Analysis ===\\n\");\n\n            queryDistribution.values().stream()\n                .sorted((a, b) -&gt; Integer.compare(b.occurrences, a.occurrences))\n                .forEach(stats -&gt; {\n                    writer.println(stats.toFormattedString());\n                    writer.println(repeatString(\"-\", 80) + \"\\n\");\n                });\n\n            \/\/ Write summary statistics\n            writer.println(\"=== Summary Statistics ===\");\n            writer.println(\"Total unique queries: \" + queryDistribution.size());\n\n            writer.println(\"\\nThread states found: \" + \n                knownStates.stream()\n                    .sorted()\n                    .collect(Collectors.joining(\", \")));\n\n            Map&lt;String, Integer&gt; totalStateDistribution = new HashMap&lt;&gt;();\n            queryDistribution.values().forEach(stats -&gt; \n                stats.stateStats.forEach((state, stateInfo) -&gt; \n                    totalStateDistribution.merge(state, stateInfo.getTotalOccurrences(), Integer::sum))\n            );\n\n            writer.println(\"\\nOverall state distribution:\");\n            totalStateDistribution.entrySet().stream()\n                .sorted(Map.Entry.&lt;String, Integer&gt;comparingByValue().reversed())\n                .forEach(entry -&gt; \n                    writer.printf(\"  %s: %d occurrences%n\", entry.getKey(), entry.getValue())\n                );\n        }\n    }\n\n    public static void main(String[] args) {\n        if (args.length != 2) {\n            System.out.println(\"Usage: java SQLLogAnalyzer &lt;log-file-path&gt; &lt;output-file-path&gt;\");\n            return;\n        }\n\n        SQLLogAnalyzer analyzer = new SQLLogAnalyzer();\n        try {\n            analyzer.analyzeLogs(args[0]);\n            analyzer.writeAnalysisToFile(args[1]);\n            System.out.println(\"Analysis has been written to: \" + args[1]);\n        } catch (IOException e) {\n            System.err.println(\"Error processing files: \" + e.getMessage());\n            e.printStackTrace();\n        }\n    }\n}\n\n<\/code><\/pre>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Summarize this content to 400 words in Persian Lang import java.io.*; import java.util.*; import java.util.regex.*; import java.util.stream.Collectors; public class SQLLogAnalyzer { private static final Pattern LOG_PATTERN = Pattern.compile(&#8220;.*?\\\\[((?:ACTIVE|STUCK|Async-Pool-\\\\d+-thread-\\\\d+|.*?))\\\\].*?(?:ExecuteThread:\\\\s+'(\\\\d+)&#8217;|).*?((?i)SELECT\\\\s+.*)&#8221;); private final Map&lt;String, QueryStats&gt; queryDistribution; private final Set&lt;String&gt; knownStates; public SQLLogAnalyzer() { this.queryDistribution = new HashMap&lt;&gt;(); this.knownStates = new HashSet&lt;&gt;(); } private static String repeatString(String str, int &hellip;<\/p>\n","protected":false},"author":2,"featured_media":88276,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"fifu_image_url":"","fifu_image_alt":"","footnotes":""},"categories":[339],"tags":[],"class_list":["post-88275","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dev"],"_links":{"self":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts\/88275","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/comments?post=88275"}],"version-history":[{"count":0,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts\/88275\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/media\/88276"}],"wp:attachment":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/media?parent=88275"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/categories?post=88275"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/tags?post=88275"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}