Adding New Arrivals in the Metrics of SUSI.AI
The SUSI Skill CMS homepage contains a lot of metics on the homepage. For example, the highest rated skills, latest skills, most used skills etc. Another important metric is the newly arrived skills in a given period of time, say in last week. This keeps the users updated with the system and allows them to know what work is going on the assistant. This also inspires the skill creators to create more skills.
Update skill listing API
To get the list of recently added skill, first of all, we need a mechanism to sort them in descending order of their creation time. Update the skill listing API ie, ListSkillService.java to sort skills by their creation time. The creation time is stored in “YYYY-MM-DD T M S” format, for ex “2018-08-12T03:11:32Z”. So it can be sorted easily using string comparison function.
Collections.sort(jsonValues, new Comparator<JSONObject>() { private static final String KEY_NAME = "creationTime"; @Override public int compare(JSONObject a, JSONObject b) { String valA = new String(); String valB = new String(); int result = 0; try { valA = a.get(KEY_NAME).toString(); valB = b.get(KEY_NAME).toString(); result = valB.compareToIgnoreCase(valA); } catch (JSONException e) { e.printStackTrace(); } return result; } });
After sorting the skills in descending order of their creation date. We need to filter them based on the time period. For example, if the skills created in last days are required then we need a generalized filter for that. This can be achieved by creating a variable for the starting date of the required time period. Say, if the skill created in last 7 days are required, then the number of milliseconds equivalent to 7 days is subtracted from the current timestamp. All the skills created after this timestamp are added to the result while others are skipped.
if (dateFilter) { long durationInMillisec = TimeUnit.DAYS.toMillis(duration); long timestamp = System.currentTimeMillis() - durationInMillisec; String startDate = new Timestamp(timestamp).toString().substring(0, 10); //substring is used for getting timestamp upto date only String skillCreationDate = jsonValues.get(i).get("creationTime").toString().substring(0,10); if (skillCreationDate.compareToIgnoreCase(startDate) < 0) { continue; } }
This filtering works in the API only when the filter type is set to date and duration in days is passed in the endpoint.
Implement new arrivals on CMS
Create the MenuItems in the sidebar that shows the filter name and add onClick handler on them. The skill listing API with the duration filter is passed to the handler. 3 MenuItems are added:
- Last 7 Days
- Last 30 Days
- Last 90 Days
<MenuItem value="&applyFilter=true&filter_name=descending&filter_type=date&duration=7" key="Last 7 Days" primaryText="Last 7 Days" onClick={event => this.handleArrivalTimeChange( event, '&applyFilter=true&filter_name=descending&filter_type=date&duration=7', ) } />
Create a handler that listens to the onClick event of the above MenuItems. This handler accepts the API endpoint and calls the loadCards function with it.
handleArrivalTimeChange = (event, value) => { this.setState({ filter: value }, function() { // console.log(this.state); this.loadCards(); }); };
Resources
- Material-UI – https://material-ui.com/api/menu-item/
- Stackoverflow (converting days into milliseconds) – https://stackoverflow.com/questions/14845238/how-to-convert-timestamp-into-days-ago
- Javatpoint – https://www.javatpoint.com/java-timestamp-to-date