1 25 26 package org.snipsnap.snip.storage; 27 28 import org.snipsnap.app.Application; 29 import org.snipsnap.snip.Snip; 30 import org.snipsnap.snip.SnipPostNameComparator; 31 import org.snipsnap.snip.storage.query.QueryKit; 32 import org.snipsnap.snip.storage.query.SnipComparator; 33 import org.snipsnap.snip.storage.query.SnipQuery; 34 35 import java.sql.Timestamp ; 36 import java.util.Collections ; 37 import java.util.Comparator ; 38 import java.util.List ; 39 import java.util.Arrays ; 40 import java.util.ArrayList ; 41 42 50 51 public class QuerySnipStorage implements SnipStorage { 52 private static Comparator nameComparator = new SnipComparator() { 55 public int compare(Snip s1, Snip s2) { 56 return s1.getName().compareTo(s2.getName()); 57 } 58 }; 59 60 private static Comparator snipPostNameComparator = new SnipPostNameComparator(); 61 62 private static Comparator nameWithoutPathComparator = new SnipComparator() { 63 public int compare(Snip s1, Snip s2) { 64 return getName(s1).compareTo(getName(s2)); 65 } 66 67 public String getName(Snip snip) { 68 String name = snip.getName(); 69 int index = name.lastIndexOf("/"); 70 if (-1 != index) { 71 return name.substring(index + 1); 72 } else { 73 return name; 74 } 75 } 76 }; 77 78 private static Comparator nameComparatorDesc = new SnipComparator() { 79 public int compare(Snip s1, Snip s2) { 80 return s2.getName().compareTo(s1.getName()); 81 } 82 }; 83 private static Comparator mTimeComparatorDesc = new SnipComparator() { 84 public int compare(Snip s1, Snip s2) { 85 return s2.getMTime().compareTo(s1.getMTime()); 86 } 87 }; 88 private static Comparator cTimeComparator = new SnipComparator() { 89 public int compare(Snip s1, Snip s2) { 90 return s1.getCTime().compareTo(s2.getCTime()); 91 } 92 }; 93 private static Comparator hotnessComparator = new SnipComparator() { 94 public int compare(Snip s1, Snip s2) { 95 return s1.getAccess().getViewCount() 96 < s2.getAccess().getViewCount() ? 1 : -1; 97 } 98 }; 99 100 private SnipStorage storage; 102 103 public QuerySnipStorage(SnipStorage storage) { 104 this.storage = storage; 105 } 106 107 public Snip[] match(String pattern) { 109 return storage.match(pattern); 110 } 111 112 public Snip[] match(String start, String end) { 113 return storage.match(start, end); 114 } 115 116 public Snip storageLoad(String name) { 117 return storage.storageLoad(name); 118 } 119 120 public void storageStore(Snip snip) { 121 storage.storageStore(snip); 122 } 123 124 public Snip storageCreate(String name, String content) { 125 return storage.storageCreate(name, content); 126 } 127 128 public void storageRemove(Snip snip) { 129 storage.storageRemove(snip); 130 } 131 132 public int storageCount() { 134 return storage.storageAll().size(); 135 } 136 137 public List storageAll() { 138 return storage.storageAll(); 139 } 140 141 public List storageAll(String applicationOid) { 142 return storage.storageAll(applicationOid); 143 } 144 145 146 public List storageByHotness(int size) { 147 return QueryKit.querySorted(storage.storageAll(), hotnessComparator, size); 148 } 149 150 public List storageByUser(final String login) { 151 return QueryKit.querySorted(storage.storageAll(), new SnipQuery() { 152 public boolean fit(Snip snip) { 153 return (login.equals(snip.getCUser())); 154 } 155 }, nameWithoutPathComparator); 156 } 157 158 public List storageByDateSince(final Timestamp date) { 159 return QueryKit.query(storage.storageAll(), new SnipQuery() { 160 public boolean fit(Snip snip) { 161 return (date.before(snip.getMTime())); 162 } 163 }); 164 } 165 166 public List storageByRecent(String applicationOid, int size) { 167 return QueryKit.querySorted(storage.storageAll(applicationOid), 168 mTimeComparatorDesc, size); 169 } 170 171 public List storageByRecent(int size) { 172 return QueryKit.querySorted(storage.storageAll(), 173 mTimeComparatorDesc, size); 174 } 175 176 public List storageByComments(final Snip parent) { 177 return QueryKit.querySorted(storage.storageAll(), new SnipQuery() { 178 public boolean fit(Snip snip) { 179 return (parent == snip.getCommentedSnip()); 180 } 181 }, cTimeComparator); 182 } 183 184 public List storageByParent(final Snip parent) { 185 return QueryKit.query(storage.storageAll(), new SnipQuery() { 186 public boolean fit(Snip snip) { 187 return (parent == snip.getParent()); 188 } 189 }); 190 } 191 192 public List storageByParentNameOrder(final Snip parent, int count) { 193 196 List list = QueryKit.querySorted(storage.storageAll(), new SnipQuery() { 197 public boolean fit(Snip snip) { 198 return (parent == snip.getParent()); 206 } 207 }, nameComparatorDesc, count); 208 return list; 210 } 211 212 public List storageByParentModifiedOrder(Snip parent, int count) { 213 List result = storageByParent(parent); 214 Collections.sort(result, mTimeComparatorDesc); 215 return result.subList(0, Math.min(count, result.size())); 216 } 217 218 public List storageByDateInName(final String nameSpace, final String start, final String end) { 219 final String queryStart = nameSpace + "/" + start + "/"; 220 final String queryEnd = nameSpace + "/" + end + "/"; 221 List blogWithParent = QueryKit.querySorted(storage.storageAll(), new SnipQuery() { 222 public boolean fit(Snip snip) { 223 String name = snip.getName(); 226 Snip parent = snip.getParent(); 227 boolean blogWithParent = (start.compareTo(name) <= 0 && end.compareTo(name) >= 0 && 228 null != parent && nameSpace.equals(parent.getName())); 229 return blogWithParent; 230 } 231 }, nameComparatorDesc); 232 234 List blogWithNameSpace = new ArrayList (Arrays.asList(match(queryStart, queryEnd))); 235 Collections.sort(blogWithNameSpace, snipPostNameComparator); 236 237 239 blogWithNameSpace.addAll(blogWithParent); 240 return blogWithNameSpace; 241 } 242 } 243 | Popular Tags |