Source code: com/virtuosotechnologies/asaph/model/opsemantics/PredicateFilterSemantics.java
1 /*
2 ================================================================================
3
4 FILE: PredicateFilterSemantics.java
5
6 PROJECT:
7
8 Asaph
9
10 CONTENTS:
11
12 An opsemantics that runs a PredicateSemantics and filters on Boolean.TRUE
13
14 PROGRAMMERS:
15
16 Daniel Azuma (DA) <dazuma@kagi.com>
17
18 COPYRIGHT:
19
20 Copyright (C) 2003 Daniel Azuma (dazuma@kagi.com)
21
22 This program is free software; you can redistribute it and/or
23 modify it under the terms of the GNU General Public License as
24 published by the Free Software Foundation; either version 2
25 of the License, or (at your option) any later version.
26
27 This program is distributed in the hope that it will be useful,
28 but WITHOUT ANY WARRANTY; without even the implied warranty of
29 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
30 GNU General Public License for more details.
31
32 You should have received a copy of the GNU General Public
33 License along with this program; if not, write to
34 Free Software Foundation, Inc.
35 59 Temple Place, Suite 330
36 Boston, MA 02111-1307 USA
37
38 ================================================================================
39 */
40
41
42 package com.virtuosotechnologies.asaph.model.opsemantics;
43
44
45 import java.util.Iterator;
46
47 import com.virtuosotechnologies.asaph.model.SongDatabase;
48 import com.virtuosotechnologies.asaph.model.SongOperation;
49 import com.virtuosotechnologies.asaph.model.SongIDResultSet;
50 import com.virtuosotechnologies.asaph.model.SongDatabaseFailedException;
51
52
53 /**
54 * An opsemantics that runs a PredicateSemantics and filters on Boolean.TRUE.
55 * Note that this does not extend ValueFilterSemantics because it does not follow the
56 * contract of ValueFilterSemantics, which states that the values are already present
57 * in the original result set.
58 * Instead, this copies the result set, runs the given PredicateSemantics, and then
59 * filters the original result set according to the result values in the copy. Note
60 * that as a result, any values in the original resultset remain untouched.
61 */
62 public interface PredicateFilterSemantics
63 extends SongOperation
64 {
65 /**
66 * Get the predicate.
67 *
68 * @return predicate
69 */
70 public PredicateSemantics getPredicate();
71
72
73 /**
74 * The default implementation of PredicateFilterSemantics
75 */
76 public static class DefaultImplementation
77 implements PredicateFilterSemantics
78 {
79 private PredicateSemantics predicate_;
80
81
82 /**
83 * Constructor
84 *
85 * @param predicate predicate
86 */
87 public DefaultImplementation(
88 PredicateSemantics predicate)
89 {
90 if (predicate == null)
91 {
92 throw new NullPointerException();
93 }
94 predicate_ = predicate;
95 }
96
97
98 /**
99 * Get the predicate.
100 *
101 * @return predicate
102 */
103 public PredicateSemantics getPredicate()
104 {
105 return predicate_;
106 }
107
108
109 /**
110 * Performs the operation on the given result set.
111 *
112 * @param resultSet the SongIDResultSet
113 * @exception SongDatabaseFailedException Catch-all exception for database-related
114 * problems. This will often have a cause exception, which may be exceptions
115 * like IOException or SQLException.
116 */
117 public void perform(
118 SongIDResultSet resultSet)
119 throws
120 SongDatabaseFailedException
121 {
122 SongDatabase database = resultSet.getDatabase();
123 SongIDResultSet copySet = resultSet.createLinkedCopy();
124 database.performOperation(predicate_, copySet);
125 for (Iterator iter = copySet.getEntryCollection().iterator(); iter.hasNext(); )
126 {
127 SongIDResultSet.Entry entry = (SongIDResultSet.Entry)iter.next();
128 if (!Boolean.TRUE.equals(entry.getData()))
129 {
130 resultSet.remove(entry.getSongID());
131 }
132 }
133 }
134
135
136 /**
137 * The equals method should return true if the given object is a SongOperation
138 * with the same semantics as this one. (i.e. it would perform the same operation.)
139 * This may be used to optimize performance. It is always safe to return false from
140 * this method, if the semantics of the given object cannot be determined.
141 * (This is similar to the equals method in java.util.Comparator.)
142 * As a corollary, it is safe just to fall back on the default implementation
143 * inherited from java.lang.Object.
144 *
145 * @param obj object to test
146 * @return true if the object is equal
147 */
148 public boolean equals(
149 Object obj)
150 {
151 if (obj instanceof PredicateFilterSemantics)
152 {
153 return ((PredicateFilterSemantics)obj).getPredicate().equals(predicate_);
154 }
155 return false;
156 }
157 }
158 }