1616// under the License.
1717package com .cloud .event .dao ;
1818
19+ import java .sql .PreparedStatement ;
20+ import java .sql .SQLException ;
1921import java .util .Date ;
2022import java .util .List ;
23+ import java .util .stream .Collectors ;
2124
2225
26+ import com .cloud .utils .db .DB ;
27+ import com .cloud .utils .db .Filter ;
28+ import com .cloud .utils .exception .CloudRuntimeException ;
2329import org .apache .commons .collections4 .CollectionUtils ;
2430import org .springframework .stereotype .Component ;
2531
26- import com .cloud .event .Event .State ;
2732import com .cloud .event .EventVO ;
28- import com .cloud .utils .db .Filter ;
2933import com .cloud .utils .db .GenericDaoBase ;
3034import com .cloud .utils .db .SearchBuilder ;
3135import com .cloud .utils .db .SearchCriteria ;
3438
3539@ Component
3640public class EventDaoImpl extends GenericDaoBase <EventVO , Long > implements EventDao {
37- protected final SearchBuilder < EventVO > CompletedEventSearch ;
41+
3842 protected final SearchBuilder <EventVO > ToArchiveOrDeleteEventSearch ;
3943
4044 public EventDaoImpl () {
41- CompletedEventSearch = createSearchBuilder ();
42- CompletedEventSearch .and ("state" , CompletedEventSearch .entity ().getState (), SearchCriteria .Op .EQ );
43- CompletedEventSearch .and ("startId" , CompletedEventSearch .entity ().getStartId (), SearchCriteria .Op .EQ );
44- CompletedEventSearch .and ("archived" , CompletedEventSearch .entity ().getArchived (), Op .EQ );
45- CompletedEventSearch .done ();
46-
4745 ToArchiveOrDeleteEventSearch = createSearchBuilder ();
46+ ToArchiveOrDeleteEventSearch .select ("id" , SearchCriteria .Func .NATIVE , ToArchiveOrDeleteEventSearch .entity ().getId ());
4847 ToArchiveOrDeleteEventSearch .and ("id" , ToArchiveOrDeleteEventSearch .entity ().getId (), Op .IN );
4948 ToArchiveOrDeleteEventSearch .and ("type" , ToArchiveOrDeleteEventSearch .entity ().getType (), Op .EQ );
5049 ToArchiveOrDeleteEventSearch .and ("accountId" , ToArchiveOrDeleteEventSearch .entity ().getAccountId (), Op .EQ );
51- ToArchiveOrDeleteEventSearch .and ("accountIds" , ToArchiveOrDeleteEventSearch .entity ().getAccountId (), Op .IN );
5250 ToArchiveOrDeleteEventSearch .and ("domainIds" , ToArchiveOrDeleteEventSearch .entity ().getDomainId (), Op .IN );
5351 ToArchiveOrDeleteEventSearch .and ("createdDateB" , ToArchiveOrDeleteEventSearch .entity ().getCreateDate (), Op .BETWEEN );
5452 ToArchiveOrDeleteEventSearch .and ("createdDateL" , ToArchiveOrDeleteEventSearch .entity ().getCreateDate (), Op .LTEQ );
@@ -57,77 +55,73 @@ public EventDaoImpl() {
5755 ToArchiveOrDeleteEventSearch .done ();
5856 }
5957
60- @ Override
61- public List <EventVO > searchAllEvents (SearchCriteria <EventVO > sc , Filter filter ) {
62- return listIncludingRemovedBy (sc , filter );
63- }
64-
65- @ Override
66- public EventVO findCompletedEvent (long startId ) {
67- SearchCriteria <EventVO > sc = CompletedEventSearch .create ();
68- sc .setParameters ("state" , State .Completed );
69- sc .setParameters ("startId" , startId );
70- sc .setParameters ("archived" , false );
71- return findOneIncludingRemovedBy (sc );
72- }
73-
74- @ Override
75- public List <EventVO > listToArchiveOrDeleteEvents (List <Long > ids , String type , Date startDate , Date endDate , List <Long > accountIds ) {
58+ private SearchCriteria <EventVO > createEventSearchCriteria (List <Long > ids , String type , Date startDate , Date endDate ,
59+ Date limitDate , Long accountId , List <Long > domainIds ) {
7660 SearchCriteria <EventVO > sc = ToArchiveOrDeleteEventSearch .create ();
77- if (ids != null ) {
78- sc .setParameters ("id" , ids .toArray (new Object [ids .size ()]));
61+
62+ if (CollectionUtils .isNotEmpty (ids )) {
63+ sc .setParameters ("id" , ids .toArray (new Object [0 ]));
7964 }
80- if (type != null ) {
81- sc .setParameters ("type " , type );
65+ if (CollectionUtils . isNotEmpty ( domainIds ) ) {
66+ sc .setParameters ("domainIds " , domainIds . toArray ( new Object [ 0 ]) );
8267 }
8368 if (startDate != null && endDate != null ) {
8469 sc .setParameters ("createdDateB" , startDate , endDate );
8570 } else if (endDate != null ) {
8671 sc .setParameters ("createdDateL" , endDate );
8772 }
88- if ( accountIds != null && ! accountIds . isEmpty ()) {
89- sc .setParameters ( "accountIds " , accountIds . toArray ( new Object [ accountIds . size ()]) );
90- }
73+ sc . setParametersIfNotNull ( "accountId" , accountId );
74+ sc .setParametersIfNotNull ( "createdDateLT " , limitDate );
75+ sc . setParametersIfNotNull ( "type" , type );
9176 sc .setParameters ("archived" , false );
92- return search (sc , null );
77+
78+ return sc ;
9379 }
9480
9581 @ Override
96- public void archiveEvents (List <EventVO > events ) {
97- if (events != null && !events .isEmpty ()) {
98- TransactionLegacy txn = TransactionLegacy .currentTxn ();
99- txn .start ();
100- for (EventVO event : events ) {
101- event = lockRow (event .getId (), true );
102- event .setArchived (true );
103- update (event .getId (), event );
104- txn .commit ();
82+ public long archiveEvents (List <Long > ids , String type , Date startDate , Date endDate , Long accountId , List <Long > domainIds ,
83+ long limitPerQuery ) {
84+ SearchCriteria <EventVO > sc = createEventSearchCriteria (ids , type , startDate , endDate , null , accountId , domainIds );
85+ Filter filter = null ;
86+ if (limitPerQuery > 0 ) {
87+ filter = new Filter (limitPerQuery );
88+ }
89+
90+ long archived ;
91+ long totalArchived = 0L ;
92+
93+ do {
94+ List <EventVO > events = search (sc , filter );
95+ if (events .isEmpty ()) {
96+ break ;
10597 }
106- txn .close ();
98+
99+ archived = archiveEventsInternal (events );
100+ totalArchived += archived ;
101+ } while (limitPerQuery > 0 && archived >= limitPerQuery );
102+
103+ return totalArchived ;
104+ }
105+
106+ @ DB
107+ private long archiveEventsInternal (List <EventVO > events ) {
108+ final String idsAsString = events .stream ()
109+ .map (e -> Long .toString (e .getId ()))
110+ .collect (Collectors .joining ("," ));
111+ final String query = String .format ("UPDATE event SET archived=true WHERE id IN (%s)" , idsAsString );
112+
113+ try (TransactionLegacy txn = TransactionLegacy .currentTxn ();
114+ PreparedStatement pstmt = txn .prepareStatement (query )) {
115+ return pstmt .executeUpdate ();
116+ } catch (SQLException e ) {
117+ throw new CloudRuntimeException (e );
107118 }
108119 }
109120
110121 @ Override
111122 public long purgeAll (List <Long > ids , Date startDate , Date endDate , Date limitDate , String type , Long accountId ,
112123 List <Long > domainIds , long limitPerQuery ) {
113- SearchCriteria <EventVO > sc = ToArchiveOrDeleteEventSearch .create ();
114-
115- if (CollectionUtils .isNotEmpty (ids )) {
116- sc .setParameters ("id" , ids .toArray (new Object [0 ]));
117- }
118- if (startDate != null && endDate != null ) {
119- sc .setParameters ("createdDateB" , startDate , endDate );
120- } else if (endDate != null ) {
121- sc .setParameters ("createdDateL" , endDate );
122- }
123- sc .setParametersIfNotNull ("createdDateLT" , limitDate );
124- sc .setParametersIfNotNull ("type" , type );
125- sc .setParametersIfNotNull ("accountId" , accountId );
126- if (CollectionUtils .isNotEmpty (domainIds )) {
127- sc .setParameters ("domainIds" , domainIds .toArray (new Object [0 ]));
128- }
129- sc .setParameters ("archived" , false );
130-
124+ SearchCriteria <EventVO > sc = createEventSearchCriteria (ids , type , startDate , endDate , limitDate , accountId , domainIds );
131125 return batchExpunge (sc , limitPerQuery );
132126 }
133127}
0 commit comments