22
33import android .support .annotation .NonNull ;
44import android .support .annotation .Nullable ;
5+ import android .support .annotation .VisibleForTesting ;
6+ import android .text .TextUtils ;
57
68import com .google .gson .Gson ;
79
1618import org .smartregister .reporting .repository .DailyIndicatorCountRepository ;
1719import org .smartregister .reporting .repository .IndicatorQueryRepository ;
1820import org .smartregister .reporting .repository .IndicatorRepository ;
19- import org .smartregister .reporting .util .AppProperties ;
2021import org .smartregister .repository .EventClientRepository ;
2122
2223import java .text .ParseException ;
2324import java .text .SimpleDateFormat ;
2425import java .util .ArrayList ;
26+ import java .util .Calendar ;
2527import java .util .Date ;
2628import java .util .HashMap ;
2729import java .util .LinkedHashMap ;
3941 */
4042
4143public class ReportIndicatorDaoImpl implements ReportIndicatorDao {
42-
4344 public static final String REPORT_LAST_PROCESSED_DATE = "REPORT_LAST_PROCESSED_DATE" ;
45+ public static String DAILY_TALLY_DATE_FORMAT = "yyyy-MM-dd" ;
46+
4447 public static String PREVIOUS_REPORT_DATES_QUERY = "select distinct eventDate, " + EventClientRepository .event_column .updatedAt + " from "
4548 + EventClientRepository .Table .event .name ();
4649
47- private static String TAG = ReportIndicatorDaoImpl .class .getCanonicalName ();
4850 private static String eventDateFormat = "yyyy-MM-dd HH:mm:ss" ;
4951 private IndicatorQueryRepository indicatorQueryRepository ;
5052 private DailyIndicatorCountRepository dailyIndicatorCountRepository ;
@@ -80,13 +82,19 @@ public void generateDailyIndicatorTallies(String lastProcessedDate) {
8082 float count ;
8183 SQLiteDatabase database = ReportingLibrary .getInstance ().getRepository ().getWritableDatabase ();
8284
83- LinkedHashMap <String , Date > reportEventDates = getReportEventDates (lastProcessedDate , database );
85+ Date timeNow = Calendar .getInstance ().getTime ();
86+ LinkedHashMap <String , Date > reportEventDates = getReportEventDates (timeNow , lastProcessedDate , database );
87+
8488 Map <String , IndicatorQuery > indicatorQueries = indicatorQueryRepository .getAllIndicatorQueries ();
8589
8690 if (!reportEventDates .isEmpty () && !indicatorQueries .isEmpty ()) {
87- String lastUpdatedDate = "" ;
91+ String lastUpdatedDate = null ;
92+
8893 for (Map .Entry <String , Date > dates : reportEventDates .entrySet ()) {
89- lastUpdatedDate = new SimpleDateFormat (eventDateFormat , Locale .getDefault ()).format (dates .getValue ());
94+ if (dates .getValue ().getTime () != timeNow .getTime ()) {
95+ lastUpdatedDate = new SimpleDateFormat (eventDateFormat , Locale .getDefault ()).format (dates .getValue ());
96+ }
97+
9098 for (Map .Entry <String , IndicatorQuery > entry : indicatorQueries .entrySet ()) {
9199 IndicatorQuery indicatorQuery = entry .getValue ();
92100 CompositeIndicatorTally tally = null ;
@@ -95,10 +103,11 @@ public void generateDailyIndicatorTallies(String lastProcessedDate) {
95103 ArrayList <Object > result = executeQueryAndReturnMultiResult (indicatorQuery .getQuery (), dates .getKey (), database );
96104
97105 // If the size contains actual result other than the column names which are at index 0
98- if (result .size () > 1 ) {
106+ if (result .size () > 1 || ( indicatorQuery . getExpectedIndicators () != null && indicatorQuery . getExpectedIndicators (). size () > 0 ) ) {
99107 tally = new CompositeIndicatorTally ();
100- tally .setValueSet (new Gson ().toJson (result ));
101108 tally .setValueSetFlag (true );
109+ tally .setValueSet (new Gson ().toJson (result ));
110+ tally .setExpectedIndicators (indicatorQuery .getExpectedIndicators ());
102111 }
103112 } else {
104113 count = executeQueryAndReturnCount (indicatorQuery .getQuery (), dates .getKey (), database );
@@ -122,12 +131,17 @@ public void generateDailyIndicatorTallies(String lastProcessedDate) {
122131 }
123132 }
124133
125- ReportingLibrary .getInstance ().getContext ().allSharedPreferences ().savePreference (REPORT_LAST_PROCESSED_DATE , lastUpdatedDate );
134+ if (!TextUtils .isEmpty (lastUpdatedDate )) {
135+ ReportingLibrary .getInstance ().getContext ().allSharedPreferences ().savePreference (REPORT_LAST_PROCESSED_DATE , lastUpdatedDate );
136+ }
137+
126138 Timber .i ("generateDailyIndicatorTallies: Generate daily tallies complete" );
127139 }
128140 }
129141
130- private LinkedHashMap <String , Date > getReportEventDates (String lastProcessedDate , SQLiteDatabase database ) {
142+ @ VisibleForTesting
143+ @ NonNull
144+ protected LinkedHashMap <String , Date > getReportEventDates (@ NonNull Date timeNow , @ Nullable String lastProcessedDate , @ NonNull SQLiteDatabase database ) {
131145
132146 ArrayList <HashMap <String , String >> values ;
133147 if (lastProcessedDate == null || lastProcessedDate .isEmpty ()) {
@@ -136,37 +150,39 @@ private LinkedHashMap<String, Date> getReportEventDates(String lastProcessedDate
136150 values = dailyIndicatorCountRepository .rawQuery (database , PREVIOUS_REPORT_DATES_QUERY .concat (" where " + EventClientRepository .event_column .updatedAt + " > '" + lastProcessedDate + "'" + " order by eventDate asc" ));
137151 }
138152
139- LinkedHashMap <String , Date > result = new LinkedHashMap <>();
153+ LinkedHashMap <String , Date > reportEventDates = new LinkedHashMap <>();
140154
141155 Date eventDate ;
142156 Date updateDate ;
143157 for (HashMap <String , String > val : values ) {
144158 eventDate = formatDate (val .get (EventClientRepository .event_column .eventDate .name ()), eventDateFormat );
145159 updateDate = formatDate (val .get (EventClientRepository .event_column .updatedAt .name ()), eventDateFormat );
146160
147- String keyDate = new SimpleDateFormat (eventDateFormat , Locale .getDefault ()).format (eventDate );
161+ String keyDate = new SimpleDateFormat (DAILY_TALLY_DATE_FORMAT , Locale .getDefault ()).format (eventDate );
148162
149- if (result .get (keyDate ) != null && updateDate != null ) {
150- if (result .get (keyDate ).getTime () < updateDate .getTime ()) {
151- result .put (keyDate , updateDate );
163+ if (reportEventDates .get (keyDate ) != null && updateDate != null ) {
164+ if (reportEventDates .get (keyDate ).getTime () < updateDate .getTime ()) {
165+ reportEventDates .put (keyDate , updateDate );
152166 }
153167 } else {
154- result .put (keyDate , updateDate );
168+ reportEventDates .put (keyDate , updateDate );
155169 }
156170 }
157- return result ;
171+
172+ String dateToday = new SimpleDateFormat (DAILY_TALLY_DATE_FORMAT , Locale .getDefault ()).format (timeNow );
173+
174+ if (reportEventDates .get (dateToday ) == null ) {
175+ reportEventDates .put (dateToday , timeNow );
176+ }
177+
178+ return reportEventDates ;
158179 }
159180
160181 private float executeQueryAndReturnCount (String queryString , String date , SQLiteDatabase database ) {
161182 // Use date in querying if specified
162183 String query = "" ;
163184 if (date != null ) {
164- if (!ReportingLibrary .getInstance ().getAppProperties ().hasProperty (AppProperties .KEY .COUNT_INCREMENTAL )
165- || ReportingLibrary .getInstance ().getAppProperties ().getPropertyBoolean (AppProperties .KEY .COUNT_INCREMENTAL )) {
166- query = queryString .contains ("%s" ) ? queryString .replaceAll ("%s" , date ) : queryString ;
167- } else {
168- query = queryString .contains ("%s" ) ? queryString .replaceAll ("%s" , date .split (" " )[0 ]) : queryString ;
169- }
185+ query = queryString .contains ("%s" ) ? queryString .replaceAll ("%s" , date ) : queryString ;
170186 Timber .i ("QUERY : %s" , query );
171187 }
172188
@@ -198,12 +214,13 @@ private float executeQueryAndReturnCount(String queryString, String date, SQLite
198214 return count ;
199215 }
200216
217+ @ NonNull
201218 private ArrayList <Object > executeQueryAndReturnMultiResult (@ NonNull String queryString , @ Nullable String date , @ NonNull SQLiteDatabase database ) {
202219 // Use date in querying if specified
203220 String query = "" ;
204221 if (date != null ) {
205222 Timber .i ("QUERY : %s" , queryString );
206- query = queryString .contains ("'%s' " ) ? String . format ( queryString , date ) : queryString ;
223+ query = queryString .contains ("%s " ) ? queryString . replaceAll ( "%s" , date ) : queryString ;
207224 }
208225 Cursor cursor = null ;
209226 ArrayList <Object > rows = new ArrayList <>();
@@ -254,6 +271,7 @@ private ArrayList<Object> executeQueryAndReturnMultiResult(@NonNull String query
254271 return rows ;
255272 }
256273
274+ @ Nullable
257275 private Date formatDate (String date , String format ) {
258276 try {
259277 return new SimpleDateFormat (format , Locale .getDefault ()).parse (date );
0 commit comments