1 10 package org.mmbase.bridge.jsp.taglib.containers; 11 12 import java.util.*; 13 14 import javax.servlet.jsp.JspTagException ; 15 16 import org.mmbase.bridge.Query; 17 import org.mmbase.bridge.util.Queries; 18 import org.mmbase.bridge.jsp.taglib.StringListTag; 19 import org.mmbase.bridge.jsp.taglib.util.Attribute; 20 import org.mmbase.storage.search.SearchQuery; 21 import org.mmbase.util.logging.*; 22 23 30 public class QueryPreviousBatchesTag extends StringListTag implements QueryContainerReferrer { 31 private static final Logger log = Logging.getLoggerInstance(QueryPreviousBatchesTag.class); 32 33 protected Attribute container = Attribute.NULL; 34 protected Attribute indexOffsetOffset = Attribute.NULL; 35 protected Attribute maxtotal = Attribute.NULL; 36 37 public void setContainer(String c) throws JspTagException { 38 container = getAttribute(c); 39 } 40 41 public void setMaxtotal(String m) throws JspTagException { 42 maxtotal = getAttribute(m); 43 } 44 45 public void setIndexoffset(String i ) throws JspTagException { 46 indexOffsetOffset = getAttribute(i); 47 } 48 49 protected int indexOffset = 0; 50 51 protected void truncateList() throws JspTagException { 52 if (max != Attribute.NULL) { 53 int m = getMaxNumber(); 54 if (m > 0 && m < returnList.size()) { 55 indexOffset += (returnList.size() - m); 56 log.error("Setting index offset to " + indexOffset); 57 returnList = returnList.subList(returnList.size() - m, returnList.size()); 58 59 } 60 } 61 } 62 63 public int getIndexOffset() { 64 return indexOffset; 65 } 66 67 68 protected List getList() throws JspTagException { 69 QueryContainer c = (QueryContainer) findParentTag(QueryContainer.class, (String ) container.getValue(this)); 70 Query query = c.getQuery(); 71 int offset = query.getOffset(); 72 int maxNumber = query.getMaxNumber(); 73 if (maxNumber == SearchQuery.DEFAULT_MAX_NUMBER) { 74 throw new JspTagException ("No max-number set. Cannot batch results (use mm:maxnumber first)"); 75 } 76 if (offset % maxNumber != 0) { throw new JspTagException ("Offset (" + offset + ") is not a multipible of max-number (" + maxNumber + "): Cannot batch results."); 78 } 79 80 81 int maxTotalSize = maxtotal.getInt(this, -1); 82 83 int maxSize; 85 if (maxTotalSize > 0) { 86 maxSize = maxTotalSize / 2; 88 int totalSize = Queries.count(query); 89 int nextSize = totalSize - offset - maxNumber; 90 int numberOfNextBatches = nextSize/ maxNumber; if (nextSize % maxNumber > 0) numberOfNextBatches++; int availableForNext = (maxTotalSize - 1) / 2; if (numberOfNextBatches < availableForNext) { maxSize += (availableForNext - numberOfNextBatches); 95 } 96 97 int max = getMaxNumber(); 98 if (max > 0 && maxSize > max) maxSize = max; 99 100 } else { 101 maxSize = getMaxNumber(); 102 } 103 104 105 List result = new ArrayList(); 106 107 while (offset > 0) { 108 offset -= maxNumber; 109 if (offset < 0) offset = 0; 110 result.add(0, new Integer (offset)); 111 if (maxSize > 0 && result.size() == maxSize) break; 112 } 113 if (offset > 0) { 114 indexOffset = offset / maxNumber + indexOffsetOffset.getInt(this, 0); 115 } else { 116 indexOffset = indexOffsetOffset.getInt(this, 0); 117 } 118 119 return result; 120 } 121 122 } 123 | Popular Tags |