1 package prefuse.data.search; 2 3 import java.util.Iterator ; 4 import java.util.StringTokenizer ; 5 6 import prefuse.data.Tuple; 7 8 9 28 public class PrefixSearchTupleSet extends SearchTupleSet { 29 30 private Trie m_trie; 31 private Trie.TrieNode m_curNode; 32 private String m_delim = " \t\n\r"; 33 private String m_query = ""; 34 35 38 public PrefixSearchTupleSet() { 39 this(false); 40 } 41 42 47 public PrefixSearchTupleSet(boolean caseSensitive) { 48 m_trie = new Trie(caseSensitive); 49 } 50 51 59 public String getDelimiterString() { 60 return m_delim; 61 } 62 63 72 public void setDelimiterString(String delim) { 73 m_delim = delim; 74 } 75 76 79 public String getQuery() { 80 return m_query; 81 } 82 83 92 public void search(String query) { 93 if ( query == null ) 94 query = ""; 95 96 if ( query.equals(m_query) ) 97 return; 98 99 Tuple[] rem = clearInternal(); 100 m_query = query; 101 StringTokenizer st = new StringTokenizer (m_query, m_delim); 102 if ( !st.hasMoreTokens() ) 103 m_query = ""; 104 while ( st.hasMoreTokens() ) 105 prefixSearch(st.nextToken()); 106 Tuple[] add = getTupleCount() > 0 ? toArray() : null; 107 fireTupleEvent(add, rem); 108 } 109 110 113 private void prefixSearch(String query) { 114 m_curNode = m_trie.find(query); 115 if ( m_curNode != null ) { 116 Iterator iter = trieIterator(); 117 while ( iter.hasNext() ) 118 addInternal((Tuple)iter.next()); 119 } 120 } 121 122 126 public void index(Tuple t, String field) { 127 String s; 128 if ( (s=t.getString(field)) == null ) return; 129 StringTokenizer st = new StringTokenizer (s,m_delim); 130 while ( st.hasMoreTokens() ) { 131 String tok = st.nextToken(); 132 addString(tok, t); 133 } 134 } 135 136 private void addString(String s, Tuple t) { 137 m_trie.addString(s,t); 138 } 139 140 144 public boolean isUnindexSupported() { 145 return true; 146 } 147 148 151 public void unindex(Tuple t, String field) { 152 String s; 153 if ( (s=t.getString(field)) == null ) return; 154 StringTokenizer st = new StringTokenizer (s,m_delim); 155 while ( st.hasMoreTokens() ) { 156 String tok = st.nextToken(); 157 removeString(tok, t); 158 } 159 } 160 161 165 public void clear() { 166 m_trie = new Trie(m_trie.isCaseSensitive()); 167 super.clear(); 168 } 169 170 private void removeString(String s, Tuple t) { 171 m_trie.removeString(s,t); 172 } 173 174 private Iterator trieIterator() { 175 return m_trie.new TrieIterator(m_curNode); 176 } 177 178 } | Popular Tags |