Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,13 @@ void removeMediaFile(Weblog weblog, MediaFile mediaFile)
List<MediaFile> searchMediaFiles(Weblog weblog,
MediaFileFilter filter) throws WebloggerException;

/**
* Count the media files searchMediaFiles() would return for the same filter,
* ignoring start index, length and order. Used to size pagers.
*/
long getMediaFileCount(Weblog weblog,
MediaFileFilter filter) throws WebloggerException;

/**
* Create default folder for media files in a weblog.
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,16 @@ WeblogEntry getWeblogEntryByAnchor(Weblog website, String anchor)
List<WeblogEntry> getWeblogEntries(WeblogEntrySearchCriteria wesc)
throws WebloggerException;

/**
* Count the rows getWeblogEntries() would return for the same criteria,
* ignoring offset, max results and sort order. Used to size pagers.
* @param wesc WeblogEntrySearchCriteria object listing desired search parameters
* @return number of matching rows
* @throws WebloggerException
*/
long getWeblogEntryCount(WeblogEntrySearchCriteria wesc)
throws WebloggerException;

/**
* Get Weblog Entries grouped by day.
* @param wesc WeblogEntrySearchCriteria object listing desired search parameters
Expand Down Expand Up @@ -227,6 +237,14 @@ List<WeblogCategory> getWeblogCategories(Weblog website)
*/
List<WeblogEntryComment> getComments(CommentSearchCriteria csc) throws WebloggerException;

/**
* Count the comments getComments() would return for the same criteria,
* ignoring offset, max results and sort order. Used to size pagers.
* @param csc CommentSearchCriteria object with fields indicating search criteria
* @return number of matching comments
*/
long getCommentCount(CommentSearchCriteria csc) throws WebloggerException;

/**
* Deletes comments that match paramters.
* @param website Website or null for all comments on site
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -583,11 +583,65 @@ public List<MediaFile> searchMediaFiles(Weblog weblog,
MediaFileFilter filter) throws WebloggerException {

List<Object> params = new ArrayList<>();
int size = 0;
String queryString = "SELECT m FROM MediaFile m WHERE ";
StringBuilder whereClause = new StringBuilder();
String queryString = "SELECT m " + mediaFilesFromWhere(weblog, filter, params);
StringBuilder orderBy = new StringBuilder();

if (filter.getOrder() != null) {
switch (filter.getOrder()) {
case NAME:
orderBy.append(" order by m.name");
break;
case DATE_UPLOADED:
orderBy.append(" order by m.dateUploaded");
break;
case TYPE:
orderBy.append(" order by m.contentType");
break;
default:
}
} else {
orderBy.append(" order by m.name");
}

TypedQuery<MediaFile> query = strategy.getDynamicQuery(queryString
+ orderBy.toString(), MediaFile.class);
for (int i = 0; i < params.size(); i++) {
query.setParameter(i + 1, params.get(i));
}

if (filter.getStartIndex() >= 0) {
query.setFirstResult(filter.getStartIndex());
query.setMaxResults(filter.getLength());
}
return query.getResultList();
}

/**
* {@inheritDoc}
*/
@Override
public long getMediaFileCount(Weblog weblog,
MediaFileFilter filter) throws WebloggerException {

List<Object> params = new ArrayList<>();
TypedQuery<Long> query = strategy.getDynamicQuery(
"SELECT COUNT(m) " + mediaFilesFromWhere(weblog, filter, params), Long.class);
for (int i = 0; i < params.size(); i++) {
query.setParameter(i + 1, params.get(i));
}
return query.getSingleResult();
}

/**
* Build the FROM and WHERE clauses shared by searchMediaFiles() and
* getMediaFileCount(), adding positional parameters to params.
*/
private String mediaFilesFromWhere(Weblog weblog, MediaFileFilter filter,
List<Object> params) {

int size = params.size();
StringBuilder whereClause = new StringBuilder();

params.add(size++, weblog);
whereClause.append("m.directory.weblog = ?").append(size);

Expand Down Expand Up @@ -659,34 +713,7 @@ public List<MediaFile> searchMediaFiles(Weblog weblog,
}
}

if (filter.getOrder() != null) {
switch (filter.getOrder()) {
case NAME:
orderBy.append(" order by m.name");
break;
case DATE_UPLOADED:
orderBy.append(" order by m.dateUploaded");
break;
case TYPE:
orderBy.append(" order by m.contentType");
break;
default:
}
} else {
orderBy.append(" order by m.name");
}

TypedQuery<MediaFile> query = strategy.getDynamicQuery(queryString
+ whereClause.toString() + orderBy.toString(), MediaFile.class);
for (int i = 0; i < params.size(); i++) {
query.setParameter(i + 1, params.get(i));
}

if (filter.getStartIndex() >= 0) {
query.setFirstResult(filter.getStartIndex());
query.setMaxResults(filter.getLength());
}
return query.getResultList();
return "FROM MediaFile m WHERE " + whereClause;
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -381,19 +381,67 @@ public List<WeblogCategory> getWeblogCategories(Weblog website)
@Override
public List<WeblogEntry> getWeblogEntries(WeblogEntrySearchCriteria wesc) throws WebloggerException {

List<Object> params = new ArrayList<>();
StringBuilder queryString = new StringBuilder("SELECT e ");
queryString.append(weblogEntriesFromWhere(wesc, params));

if (wesc.getSortBy() != null && wesc.getSortBy().equals(WeblogEntrySearchCriteria.SortBy.UPDATE_TIME)) {
queryString.append(" ORDER BY e.updateTime ");
} else {
queryString.append(" ORDER BY e.pubTime ");
}

if (wesc.getSortOrder() != null && wesc.getSortOrder().equals(WeblogEntrySearchCriteria.SortOrder.ASCENDING)) {
queryString.append("ASC ");
} else {
queryString.append("DESC ");
}


TypedQuery<WeblogEntry> query = strategy.getDynamicQuery(queryString.toString(), WeblogEntry.class);
for (int i=0; i<params.size(); i++) {
query.setParameter(i+1, params.get(i));
}

setFirstMax( query, wesc.getOffset(), wesc.getMaxResults() );
return query.getResultList();
}

/**
* @inheritDoc
*/
@Override
public long getWeblogEntryCount(WeblogEntrySearchCriteria wesc) throws WebloggerException {
List<Object> params = new ArrayList<>();
// COUNT(e), not COUNT(DISTINCT e): the tag join can repeat an entry, and the
// count must match the rows getWeblogEntries() pages through.
TypedQuery<Long> query = strategy.getDynamicQuery(
"SELECT COUNT(e) " + weblogEntriesFromWhere(wesc, params), Long.class);
for (int i=0; i<params.size(); i++) {
query.setParameter(i+1, params.get(i));
}
return query.getSingleResult();
}

/**
* Build the FROM and WHERE clauses shared by getWeblogEntries() and
* getWeblogEntryCount(), adding positional parameters to params.
*/
private String weblogEntriesFromWhere(WeblogEntrySearchCriteria wesc, List<Object> params)
throws WebloggerException {

WeblogCategory cat = null;
if (StringUtils.isNotEmpty(wesc.getCatName()) && wesc.getWeblog() != null) {
cat = getWeblogCategoryByName(wesc.getWeblog(), wesc.getCatName());
}

List<Object> params = new ArrayList<>();
int size = 0;
int size = params.size();
StringBuilder queryString = new StringBuilder();

if (wesc.getTags() == null || wesc.getTags().isEmpty()) {
queryString.append("SELECT e FROM WeblogEntry e WHERE ");
queryString.append("FROM WeblogEntry e WHERE ");
} else {
queryString.append("SELECT e FROM WeblogEntry e JOIN e.tags t WHERE ");
queryString.append("FROM WeblogEntry e JOIN e.tags t WHERE ");
queryString.append("(");
for (int i = 0; i < wesc.getTags().size(); i++) {
if (i != 0) {
Expand Down Expand Up @@ -453,26 +501,7 @@ public List<WeblogEntry> getWeblogEntries(WeblogEntrySearchCriteria wesc) throws
queryString.append(") ");
}

if (wesc.getSortBy() != null && wesc.getSortBy().equals(WeblogEntrySearchCriteria.SortBy.UPDATE_TIME)) {
queryString.append(" ORDER BY e.updateTime ");
} else {
queryString.append(" ORDER BY e.pubTime ");
}

if (wesc.getSortOrder() != null && wesc.getSortOrder().equals(WeblogEntrySearchCriteria.SortOrder.ASCENDING)) {
queryString.append("ASC ");
} else {
queryString.append("DESC ");
}


TypedQuery<WeblogEntry> query = strategy.getDynamicQuery(queryString.toString(), WeblogEntry.class);
for (int i=0; i<params.size(); i++) {
query.setParameter(i+1, params.get(i));
}

setFirstMax( query, wesc.getOffset(), wesc.getMaxResults() );
return query.getResultList();
return queryString.toString();
}

/**
Expand Down Expand Up @@ -631,10 +660,46 @@ public boolean isWeblogCategoryInUse(WeblogCategory cat)
public List<WeblogEntryComment> getComments(CommentSearchCriteria csc) throws WebloggerException {

List<Object> params = new ArrayList<>();
int size = 0;
StringBuilder queryString = new StringBuilder();
queryString.append("SELECT c FROM WeblogEntryComment c ");
StringBuilder queryString = new StringBuilder("SELECT c ");
queryString.append(commentsFromWhere(csc, params));
if (csc.isReverseChrono()) {
queryString.append(" ORDER BY c.postTime DESC");
} else {
queryString.append(" ORDER BY c.postTime ASC");
}

TypedQuery<WeblogEntryComment> query = strategy.getDynamicQuery(queryString.toString(), WeblogEntryComment.class);
setFirstMax( query, csc.getOffset(), csc.getMaxResults());
for (int i=0; i<params.size(); i++) {
query.setParameter(i+1, params.get(i));
}
return query.getResultList();

}

/**
* @inheritDoc
*/
@Override
public long getCommentCount(CommentSearchCriteria csc) throws WebloggerException {
List<Object> params = new ArrayList<>();
TypedQuery<Long> query = strategy.getDynamicQuery(
"SELECT COUNT(c) " + commentsFromWhere(csc, params), Long.class);
for (int i=0; i<params.size(); i++) {
query.setParameter(i+1, params.get(i));
}
return query.getSingleResult();
}

/**
* Build the FROM and WHERE clauses shared by getComments() and
* getCommentCount(), adding positional parameters to params.
*/
private String commentsFromWhere(CommentSearchCriteria csc, List<Object> params) {

int size = params.size();
StringBuilder queryString = new StringBuilder("FROM WeblogEntryComment c ");

StringBuilder whereClause = new StringBuilder();
if (csc.getEntry() != null) {
params.add(size++, csc.getEntry());
Expand Down Expand Up @@ -669,19 +734,8 @@ public List<WeblogEntryComment> getComments(CommentSearchCriteria csc) throws We
if(whereClause.length() != 0) {
queryString.append(" WHERE ").append(whereClause);
}
if (csc.isReverseChrono()) {
queryString.append(" ORDER BY c.postTime DESC");
} else {
queryString.append(" ORDER BY c.postTime ASC");
}

TypedQuery<WeblogEntryComment> query = strategy.getDynamicQuery(queryString.toString(), WeblogEntryComment.class);
setFirstMax( query, csc.getOffset(), csc.getMaxResults());
for (int i=0; i<params.size(); i++) {
query.setParameter(i+1, params.get(i));
}
return query.getResultList();


return queryString.toString();
}


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,7 @@ public boolean isWeblogRequired() {
public void loadComments() {

List<WeblogEntryComment> comments = Collections.emptyList();
boolean hasMore = false;
long totalCount = 0;
try {
WeblogEntryManager wmgr = WebloggerFactory.getWeblogger().getWeblogEntryManager();

Expand All @@ -109,19 +109,13 @@ public void loadComments() {
csc.setEndDate(getBean().getEndDate());
csc.setStatus(getBean().getStatus());
csc.setReverseChrono(true);
totalCount = wmgr.getCommentCount(csc);
csc.setOffset(getBean().getPage() * COUNT);
csc.setMaxResults(COUNT+1);
csc.setMaxResults(COUNT);

List<WeblogEntryComment> rawComments = wmgr.getComments(csc);
comments = new ArrayList<>();
comments.addAll(rawComments);
comments = new ArrayList<>(wmgr.getComments(csc));

if(!comments.isEmpty()) {
if(comments.size() > COUNT) {
comments.remove(comments.size()-1);
hasMore = true;
}

setFirstComment(comments.get(0));
setLastComment(comments.get(comments.size()-1));
}
Expand All @@ -132,7 +126,7 @@ public void loadComments() {

// build comments pager
String baseUrl = buildBaseUrl();
setPager(new CommentsPager(baseUrl, getBean().getPage(), comments, hasMore));
setPager(new CommentsPager(baseUrl, getBean().getPage(), comments, totalCount, COUNT));
}


Expand Down Expand Up @@ -184,25 +178,9 @@ public String query() {
// load bean data using comments list
getBean().loadCheckboxes(getPager().getItems());

try {
WeblogEntryManager wmgr = WebloggerFactory.getWeblogger().getWeblogEntryManager();

CommentSearchCriteria csc = new CommentSearchCriteria();
csc.setSearchText(getBean().getSearchString());
csc.setStartDate(getBean().getStartDate());
csc.setEndDate(getBean().getEndDate());
csc.setStatus(getBean().getStatus());
csc.setReverseChrono(true);

List<WeblogEntryComment> allMatchingComments = wmgr.getComments(csc);

if(allMatchingComments.size() > COUNT) {
setBulkDeleteCount(allMatchingComments.size());
}

} catch (WebloggerException ex) {
log.error("Error looking up comments", ex);
addError("commentManagement.lookupError");
// offer bulk delete when the matches span more than one page
if (getPager().getTotalCount() > COUNT) {
setBulkDeleteCount((int) getPager().getTotalCount());
}

return LIST;
Expand Down
Loading
Loading