001    /***************************************************************************************************
002     *               MODULE DESCRIPTION
003     ****************************************************************************************************
004     *
005     *               NAME:           ReservationSearch.java
006     *               LANGUAGE:       Java2
007     *               DATE:           18.2.2003
008     *               AUTHOR:         Miika Nurminen, Jyväskylän yliopisto
009     *
010     ****************************************************************************************************
011     *               COPYRIGHT (C) KIURU -PROJECT GROUP
012     *               Limited rights granted. Please refer to license.
013     ****************************************************************************************************
014     *  
015     ****************************************************************************************************
016     *               UPDATES
017     ****************************************************************************************************
018     *
019     *   18.2.2003 Initial release
020     *
021     ****************************************************************************************************/
022    package kiurubeans;
023    import kotkabeans.*;
024    
025    /**
026     * Search class for Reservations
027     */
028    public class ReservationSearch extends SearchHandler {
029      /** reservation id used in queries */
030      int reservationId = 0;
031      /** if true, also old reservations are searched */
032      boolean oldReservations = false;
033      
034      
035      /** Creates a new instance of ReservationSearch */
036      public ReservationSearch() {
037        setVisibleFields(new Field[] {
038         // UPPER cannot be used with order by in distinct clauses
039          new Field("code",new HiddenFieldOrderScheme("ord_code")),
040          new Field("begintime"),
041          new Field("endtime"),
042          new Field("kurssikoodi"),
043          new Field("overlappings"),
044          new Field("personname"), // note! UPPER(alias) cannot be used. actual fieldname must be applied
045          new Field("callname"), // note! UPPER(alias) cannot be used. actual fieldname must be applied
046          new Field("state"), 
047          new Field("organisation"),
048          new Field("eventname",new HiddenFieldOrderScheme("ord_eventname"))
049        });
050        assignDefaultOrder();
051      }
052      
053     
054      
055      /**
056       * Setter for attribute reservationId
057       * @param i new id
058       */  
059      public void setReservationId(int i) {
060        this.reservationId=i;
061      }
062      
063      /**
064       * Getter for attribute reservationId
065       * @return current id
066       */  
067      public int getReservationId() {
068        return this.reservationId;
069      }
070    
071      
072      /**
073       * Gets sql string for retrieving reservations
074       * @return reservation sql
075       */  
076      public String getReservationSql() {
077        if (getReservationId()==0)
078          return getReservationSql(false,0);
079        else
080          return getReservationSql(true,getReservationId());
081      }
082      
083      /**
084       * Gets sql string for retrieving a single reservation data
085       * @param resId input reservation id
086       * @return reservation sql    
087       */  
088      public String getReservationSql(int resId) {
089        return getReservationSql(true,resId);
090      }
091    
092      /**
093       * Setter for attribute oldReservations
094       * @param b new value
095       */  
096      public void setOldReservations(boolean b) {
097        this.oldReservations=b;
098      }
099      
100      /**
101       * Getter for attribute oldReservations
102       * @return current value
103       */  
104      public boolean getOldReservations() {
105        return this.oldReservations;
106      }
107      
108      
109      /**
110       * Returns SQL clause for all resevations
111       * @param getOverlappingList if true, returns list for overlappings with reservation of id
112       * @param id used if getOverlappingList==true
113       */
114      private String getReservationSql(boolean getOverlappingList, int id) {
115        StringBuffer q = new StringBuffer(200);
116        q.append(" SELECT UPPER(space.code) as ord_code, requeststate.name AS state, organisationtranslation.name ");
117        q.append(" AS organisation,begintime,endtime, CASE WHEN course.code is not NULL  ");
118        q.append(" THEN course.code ELSE '-' END as kurssikoodi,r1.reservationid,  ");
119        q.append("(CASE WHEN (e1.name NOT LIKE '' AND e1.name IS NOT NULL) THEN e1.name ");
120        q.append("WHEN (eventgroup.name NOT LIKE '' AND eventgroup.name IS NOT NULL) THEN eventgroup.name ");
121        q.append("ELSE '' END) AS eventname, ");
122        q.append("UPPER(CASE WHEN (e1.name NOT LIKE '' AND e1.name IS NOT NULL) THEN e1.name ");
123        q.append("WHEN (eventgroup.name NOT LIKE '' AND eventgroup.name IS NOT NULL) THEN eventgroup.name ");
124        q.append("ELSE '' END) AS ord_eventname, ");
125        q.append("e1.eventid,space.code as code, ");
126        q.append("       ( SELECT count(*) ");
127        q.append(" FROM reservation as r2, event as e2 ");
128        q.append(" WHERE r1.reservationid<>r2.reservationid ");
129        q.append(" AND r1.spaceid = r2.spaceid ");
130        q.append(" AND e2.eventid = r2.eventid ");
131        q.append(" AND r1.inconsistent =0 ");
132        q.append(" AND r2.inconsistent =0 ");
133        q.append(" AND r1.requeststateid<4 ");
134        q.append(" AND r2.requeststateid<4 ");
135        q.append(" AND r2.deleted=false ");
136    //    q.append(" AND e2.begintime>NOW()  "); // also past reservations may overlap
137        q.append(" AND (e1.begintime,e1.endtime) OVERLAPS (e2.begintime,e2.endtime) ");
138        q.append(" ) as overlappings, ");
139        q.append(" space.spaceid as spaceid, ");
140        q.append("CASE WHEN p.personid IS NOT NULL THEN p.lastname ELSE p.lastname END as personname, ");
141        q.append("CASE WHEN p.personid IS NOT NULL THEN p.callname ELSE p.callname END as callname ");
142    /*    q.append("        (    select (p.lastname || ' ' || p.callname) as personname from ");
143        q.append("reservationperson as rp join person as p on rp.personid=p.personid ");
144        q.append("    where r1.reservationid=rp.reservationid ");
145        q.append("    and rp.reservationroleid=3 ");
146        q.append("      and rp.deleted='f' ");
147        q.append("limit 1 ");
148        q.append("    ) as personname ");*/
149        
150        q.append(" FROM space, ");
151        q.append("       reservation as r1,event as e1,organisation LEFT OUTER JOIN organisationtranslation  ");
152        q.append("       ON organisation.organisationid=organisationtranslation.organisationid,  ");
153        q.append("       (eventgroup left outer join courseinstance on  ");
154        q.append("       eventgroup.courseinstanceid=courseinstance.courseinstanceid LEFT OUTER  ");
155        q.append("       JOIN course on courseinstance.courseid=course.courseid),requeststate ");
156    
157        // for person names
158        q.append(" ,reservationperson as rp join person as p on rp.personid=p.personid ");
159        
160        q.append("       WHERE r1.requeststateid=requeststate.requeststateid AND  ");
161    
162        // for person names
163        q.append("     r1.reservationid=rp.reservationid ");
164        q.append("    and rp.reservationroleid=3 ");
165        q.append("      and rp.deleted='f' and ");
166    
167        q.append("       r1.eventid=e1.eventid and e1.eventgroupid= ");
168        q.append("       eventgroup.eventgroupid and requeststate.requeststateid<");
169        if (getOverlappingList) q.append("4"); else q.append("3 ");
170        q.append(" and r1.spaceid=space.spaceid and  ");
171        q.append("       r1.resorganisationid=organisation.organisationid and  ");
172        q.append("       organisationtranslation.languageid=2 and space.deleted=false and  ");
173        q.append("       r1.deleted=false and e1.deleted=false and  ");
174        q.append("       organisation.deleted=false ");
175        if (getOverlappingList) {
176          q.append(" and r1.reservationid in ( SELECT r1.reservationid ");
177          q.append(" FROM reservation as r2, event as e2 ");
178          q.append(" WHERE r1.spaceid = r2.spaceid ");
179          q.append(" AND r2.reservationid ="+id);
180          q.append(" AND e2.eventid = r2.eventid ");
181          q.append(" AND r1.inconsistent =0 ");
182          q.append(" AND r2.inconsistent =0 ");
183          q.append(" AND r1.requeststateid<4 ");
184          q.append(" AND r2.requeststateid<4 ");
185          q.append(" AND r2.deleted=false ");
186    //      q.append(" AND e2.begintime>NOW()  "); // also past reservations may overlap
187          q.append(" AND (e1.begintime,e1.endtime) OVERLAPS (e2.begintime,e2.endtime) ) ");
188        }
189        q.append(getOrderClause());
190        return q.toString();
191      }
192      
193      /** Returns all active reservations active since now.
194       * @param db open db connection
195       * @throws Exception if problems with db connections
196       * @return reservation info
197       */
198      public RS2 getReservations(DB db) throws Exception {
199        return new RS2(db.executeQuery(getReservationSql()));
200      }
201                                                   
202      /**
203       * returns person's reservations
204       * @param db open db connection 
205       * @param personId person whose reservations we are searching
206       * @throws Exception if problems with db connections
207       * @return reservation info
208       */  
209      public RS2 getReservations(DB db,int personId) throws Exception {
210        StringBuffer q = new StringBuffer(100);
211        q.append("SELECT DISTINCT UPPER(space.code) as ord_code, r1.reservationid as reservation_id,requeststate.name as state, CASE WHEN course.code IS NOT NULL THEN course.code ELSE '-' END as kurssikoodi, ");
212        q.append("(CASE WHEN (event.name NOT LIKE '' AND event.name IS NOT NULL) THEN event.name ");
213        q.append("WHEN (eventgroup.name NOT LIKE '' AND eventgroup.name IS NOT NULL) THEN eventgroup.name ");
214        q.append("ELSE '' END) AS eventname,");
215        q.append("UPPER(CASE WHEN (event.name NOT LIKE '' AND event.name IS NOT NULL) THEN event.name ");
216        q.append("WHEN (eventgroup.name NOT LIKE '' AND eventgroup.name IS NOT NULL) THEN eventgroup.name ");
217        q.append("ELSE '' END) AS ord_eventname,");
218        q.append("CASE WHEN rp1.personid IS NOT NULL THEN p1.lastname ELSE p2.lastname END as personname, ");
219        q.append("CASE WHEN rp1.personid IS NOT NULL THEN p1.callname ELSE p2.callname END as callname, ");
220        q.append("space.code as code ,begintime,endtime, space.spaceid as spaceid,event.eventid as eventid, 0 as organisation, 0 as overlappings FROM space, reservation as r1,");
221        q.append("reservation as r2, event left outer join eventgroup on ");
222        q.append("event.eventgroupid=eventgroup.eventgroupid left outer join courseinstance ");
223        q.append("ON eventgroup.courseinstanceid = courseinstance.courseinstanceid ");
224        q.append("left outer join course on courseinstance.courseid=course.courseid,");
225        q.append("(reservationperson as rp2 left outer join reservationperson as rp1 on ");
226        q.append("(rp1.reservationid=rp2.reservationid and  rp1.reservationroleid=3) left outer join person as p1 on ");
227        q.append("(rp1.personid=p1.personid)),person as p2 where r1.spaceid=space.spaceid and ");
228        q.append("r1.requeststateid=requeststate.requeststateid and  r1.eventid=event.eventid and ");
229        q.append("r1.reservationid=r2.reservationid and ");
230        q.append("r2.reservationid=rp2.reservationid and rp2.personid="+personId+" and r1.deleted='false' and r2.deleted='false' ");
231        q.append("and rp2.deleted='false' and rp2.personid=p2.personid");
232        if (!getOldReservations()) q.append(" and event.begintime>NOW()");
233        q.append(getOrderClause());
234        return new RS2(db.executeQuery(q.toString()));
235      }
236      
237      
238      /** Default implementation of clearing action state. Descendant classes may
239       * override this. No implementation in this class.
240       * @see SearchHandler#doClearActionState(HttpServletRequest)
241       * @param request The request-object of the JSP.
242       */
243      protected void doClearActionState(javax.servlet.http.HttpServletRequest request) {
244      }
245      
246      /** Ensures empty request parameters are clearer when entity is posted.
247       * <p>
248       * If bean is used in a JSP, this should be called in the beginning of page.
249       * If form content is "" or null it is not sent via HTTP, so those fields
250       * must be cleared manually. No action yet.
251       *
252       * @param request HTTP request with parameters
253       * @see SearchHandler#clearEmptyParameters(HttpServletRequest)
254       */
255      protected void doClearEmptyParameters(javax.servlet.http.HttpServletRequest request) {
256      }
257    
258      /** 
259       * No implementation yet.
260       */
261      protected void defaultAction() {
262      }
263      
264      /**
265       * No implementation yet.
266       */
267       public void submitSearch() {
268       }
269       
270      /**
271       * No implementation yet.
272       */
273       public void resetSearch() {
274       }
275    }
276    /***************************************************************************************************
277     *               COPYRIGHT (C) KIURU -PROJECT GROUP
278     *               Limited rights granted. Please refer to license.
279     **************************************************************************************************/