diff --git a/vipra-cmd/src/main/java/de/vipra/cmd/file/FilebaseWindowIndex.java b/vipra-cmd/src/main/java/de/vipra/cmd/file/FilebaseWindowIndex.java index 84abb8d57afb903decd3bd6a6079de2e7f3c58ea..4a602a76fd98aa58a63a9977b387a942d1117a3a 100644 --- a/vipra-cmd/src/main/java/de/vipra/cmd/file/FilebaseWindowIndex.java +++ b/vipra-cmd/src/main/java/de/vipra/cmd/file/FilebaseWindowIndex.java @@ -156,7 +156,13 @@ public class FilebaseWindowIndex { return window; } - private void resizeWindows() { + public void clear() { + windowSizes.clear(); + windowDates.clear(); + windowMap.clear(); + } + + public void resizeWindows() { final List<Date> dates = new ArrayList<>(windowMap.keySet()); Collections.sort(dates); windowSizes = new ArrayList<>(windowMap.size()); diff --git a/vipra-cmd/src/main/java/de/vipra/cmd/lda/Analyzer.java b/vipra-cmd/src/main/java/de/vipra/cmd/lda/Analyzer.java index 1b0d9b9f64bd9ef55ff71064ea6f3ed401f45e1c..6bad2608731d2011c684a1cfd71366d563e737b9 100644 --- a/vipra-cmd/src/main/java/de/vipra/cmd/lda/Analyzer.java +++ b/vipra-cmd/src/main/java/de/vipra/cmd/lda/Analyzer.java @@ -106,7 +106,13 @@ public class Analyzer { BufferedReader in; + final FilebaseWordIndex wordIndex = new FilebaseWordIndex(modelDir); + final FilebaseIDDateIndex idDateIndex = new FilebaseIDDateIndex(modelDir); + final FilebaseWindowIndex windowIndex = new FilebaseWindowIndex(modelDir, modelConfig.getWindowResolution()); + if (!reread) { + recalcWindows(idDateIndex, windowIndex); + final Process p = Runtime.getRuntime().exec(command, null); if (!p.isAlive()) throw new AnalyzerException("dtm process is dead"); @@ -160,10 +166,6 @@ public class Analyzer { p.waitFor(); } - final FilebaseWordIndex wordIndex = new FilebaseWordIndex(modelDir); - final FilebaseIDDateIndex idDateIndex = new FilebaseIDDateIndex(modelDir); - final FilebaseWindowIndex windowIndex = new FilebaseWindowIndex(modelDir, modelConfig.getWindowResolution()); - final int topicCount = modelConfig.getkTopics(); assert topicCount > 0; @@ -512,4 +514,11 @@ public class Analyzer { return msg.length() - 1; } + private void recalcWindows(final FilebaseIDDateIndex idDateIndex, final FilebaseWindowIndex windowIndex) throws IOException { + windowIndex.clear(); + for (final FilebaseIDDateIndexEntry date : idDateIndex) + windowIndex.add(date.getDate()); + windowIndex.sync(); + } + } diff --git a/vipra-ui/app/html/directives/article-link.html b/vipra-ui/app/html/directives/article-link.html index 7dcc4456c05ff10b50e5cc4adcc4d47b28fdabbe..ddd58cc3834bed20bad53ebb9fbc1957356988a1 100644 --- a/vipra-ui/app/html/directives/article-link.html +++ b/vipra-ui/app/html/directives/article-link.html @@ -1,13 +1,13 @@ <div class="link-wrapper"> - <span class="menu-padding"> - <a class="article-link" ui-sref="articles.show({id:article.id})" ng-attr-title="{{::article.title}}"> - <span ng-bind="article.title"></span> - <ng-transclude/> - </a> + <span class="menu-padding ellipsis"> <div class="pull-right article-dropdown"> <i class="fa text-muted pointer" ng-class="{'fa-chevron-down':!excerptShown,'fa-chevron-up':excerptShown}" ng-click="toggleExcerpt()" ng-if="::showExcerpt" analytics-on analytics-event="Article excerpt" analytics-category="Article actions"></i> <span class="badge" ng-bind="::article.topicsCount" ng-attr-title="{{::article.topicsCount}} topic(s)" ng-if="::showBadge"></span> </div> + <a class="article-link" ui-sref="articles.show({id:article.id})" ng-attr-title="{{::article.title}}"> + <span ng-bind="article.title"></span> + <ng-transclude/> + </a> </span> <article-menu class="menu-button" article="article" ng-if="::showMenu" /> <div ng-bind="excerpt" ng-if="excerptShown" class="excerpt"></div> diff --git a/vipra-ui/app/html/directives/topic-link.html b/vipra-ui/app/html/directives/topic-link.html index 8b34ee860d5bb6121aa8aadf29ed54b7a8beac3b..5782551b36acc19385329085760830211bc6fd7c 100644 --- a/vipra-ui/app/html/directives/topic-link.html +++ b/vipra-ui/app/html/directives/topic-link.html @@ -1,10 +1,10 @@ <div class="link-wrapper"> - <span class="menu-padding"> + <span class="menu-padding ellipsis"> + <span class="badge pull-right" ng-bind="::topic.articlesCount" ng-attr-title="{{::topic.articlesCount}} article(s)" ng-if="::showBadge"></span> <a class="topic-link" ui-sref="topics.show({id:topic.id})" ng-attr-title="{{::topic.name}}"> <span ng-bind="topic.name"></span> <ng-transclude/> </a> - <span class="badge pull-right" ng-bind="::topic.articlesCount" ng-attr-title="{{::topic.articlesCount}} article(s)" ng-if="::showBadge"></span> </span> <topic-menu topic="topic" class="menu-button" ng-if="::showMenu" /> </div> diff --git a/vipra-ui/app/js/helpers.js b/vipra-ui/app/js/helpers.js index c8eba43588d65ba0f5b47d82997893220372e945..63dfc88a141f0b67cf7eeed848c6412197d5f150 100644 --- a/vipra-ui/app/js/helpers.js +++ b/vipra-ui/app/js/helpers.js @@ -41,35 +41,50 @@ Vipra.windowLabel = function(date, res) { date = moment(date); var parts = []; - if (res === 'QUARTER') { - parts.push('Q' + date.quarter()); - parts.push(' '); - parts.push(date.year()); - } else { - switch (res) { - case 'SECOND': - parts.push(Vipra.zeroPad(date.second())); - /* falls through */ - case 'MINUTE': - parts.push(':'); - parts.push(Vipra.zeroPad(date.minute())); - /* falls through */ - case 'HOUR': - parts.push(':'); - parts.push(Vipra.zeroPad(date.hour())); - /* falls through */ - case 'DAY': - parts.push(' '); - parts.push(Vipra.zeroPad(date.day() + 1)); - /* falls through */ - case 'MONTH': - parts.push('-'); - parts.push(Vipra.zeroPad(date.month() + 1)); - /* falls through */ - case 'YEAR': - parts.push('-'); - parts.push(date.year()); - } + switch (res) { + case 'SECOND': + parts.push(Vipra.zeroPad(date.second())); + /* falls through */ + case 'MINUTE': + parts.push(':'); + parts.push(Vipra.zeroPad(date.minute())); + /* falls through */ + case 'HOUR': + parts.push(':'); + parts.push(Vipra.zeroPad(date.hour())); + /* falls through */ + case 'DAY': + parts.push(' '); + parts.push(Vipra.zeroPad(date.day() + 1)); + /* falls through */ + case 'MONTH': + parts.push('-'); + parts.push(Vipra.zeroPad(date.month() + 1)); + /* falls through */ + case 'YEAR': + parts.push('-'); + parts.push(date.year()); + break; + case 'WEEK': + parts.push('W' + date.week()); + parts.push(' '); + parts.push(date.year()); + break; + case 'SEMESTER': + parts.push('S' + date.month() < 6 ? 1 : 2); + parts.push(' '); + parts.push(date.year()); + break; + case 'TRIMESTER': + var month = date.month(); + parts.push('T' + month < 4 ? 1 : month < 8 ? 2 : 3); + parts.push(' '); + parts.push(date.year()); + break; + case 'QUARTER': + parts.push('Q' + date.quarter()); + parts.push(' '); + parts.push(date.year()); } var rtrim = /^[\s\uFEFF\xA0:-]+|[\s\uFEFF\xA0:-]+$/g; return parts.reverse().join('').replace(rtrim, ''); diff --git a/vipra-util/src/main/java/de/vipra/util/CountMap.java b/vipra-util/src/main/java/de/vipra/util/CountMap.java index 8bca6b168f763e07c9e3b7642a6f82e573a6e1d7..6a7953df892699512ec8df59eeaf34e1e79404fd 100644 --- a/vipra-util/src/main/java/de/vipra/util/CountMap.java +++ b/vipra-util/src/main/java/de/vipra/util/CountMap.java @@ -53,4 +53,8 @@ public class CountMap<T> { return map.containsKey(key); } + public void clear() { + map.clear(); + } + } diff --git a/vipra-util/src/main/java/de/vipra/util/service/MongoService.java b/vipra-util/src/main/java/de/vipra/util/service/MongoService.java index 67f11bda558ecd8b06ef8cac3eaaaae81b47f21f..90ea54693c35ca8f07122f6ffae926946ab12b45 100644 --- a/vipra-util/src/main/java/de/vipra/util/service/MongoService.java +++ b/vipra-util/src/main/java/de/vipra/util/service/MongoService.java @@ -3,6 +3,7 @@ package de.vipra.util.service; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.HashMap; +import java.util.Iterator; import java.util.List; import java.util.Map; @@ -110,6 +111,20 @@ public class MongoService<Type extends Model<IdType>, IdType> { return getMultiple(QueryBuilder.builder().fields(true, fields)); } + public Iterator<Type> getAllIterator(final QueryBuilder builder) { + final Query<Type> query = datastore.createQuery(clazz); + + if (builder != null) { + builder.build(query); + if (builder.getFields() == null && !builder.isAllFields() && ignoredFieldsMultiQuery.length > 0) { + query.retrievedFields(false, ignoredFieldsMultiQuery); + } + } else if (ignoredFieldsMultiQuery.length > 0) { + query.retrievedFields(false, ignoredFieldsMultiQuery); + } + return query.iterator(); + } + public Type createSingle(final Type t) throws DatabaseException { if (t == null) throw new DatabaseException(new NullPointerException("entity is null"));