Skip to content
This repository was archived by the owner on Sep 15, 2025. It is now read-only.

Commit bae644c

Browse files
authored
Merge pull request #160 from wordpress-mobile/feature/stats-fetch-likes-separately
Stats: separate out fetching "likes" from "Summary" for performance speedup.
2 parents 95d6ab5 + 6e35e64 commit bae644c

File tree

3 files changed

+157
-20
lines changed

3 files changed

+157
-20
lines changed

WordPressKit.podspec

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
Pod::Spec.new do |s|
22
s.name = "WordPressKit"
3-
s.version = "4.1.2-beta.1"
3+
s.version = "4.1.2-beta.2"
44
s.summary = "WordPressKit offers a clean and simple WordPress.com and WordPress.org API."
55

66
s.description = <<-DESC

WordPressKit/Time Interval/StatsSummaryTimeIntervalData.swift

Lines changed: 111 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,8 @@ extension StatsSummaryTimeIntervalData: StatsTimeIntervalData {
4444

4545
public static func queryProperties(with date: Date, period: StatsPeriodUnit, maxCount: Int) -> [String : String] {
4646
return ["unit": period.stringValue,
47-
"quantity": String(maxCount)]
47+
"quantity": String(maxCount),
48+
"stat_fields": "views,visitors,comments"]
4849
}
4950

5051
public init?(date: Date, period: StatsPeriodUnit, jsonDictionary: [String : AnyObject]) {
@@ -69,7 +70,6 @@ extension StatsSummaryTimeIntervalData: StatsTimeIntervalData {
6970
let periodIndex = fieldsArray.firstIndex(of: "period"),
7071
let viewsIndex = fieldsArray.firstIndex(of: "views"),
7172
let visitorsIndex = fieldsArray.firstIndex(of: "visitors"),
72-
let likesIndex = fieldsArray.firstIndex(of: "likes"),
7373
let commentsIndex = fieldsArray.firstIndex(of: "comments")
7474
else {
7575
return nil
@@ -82,7 +82,7 @@ extension StatsSummaryTimeIntervalData: StatsTimeIntervalData {
8282
periodIndex: periodIndex,
8383
viewsIndex: viewsIndex,
8484
visitorsIndex: visitorsIndex,
85-
likesIndex: likesIndex,
85+
likesIndex: nil,
8686
commentsIndex: commentsIndex) }
8787
}
8888
}
@@ -91,23 +91,61 @@ private extension StatsSummaryData {
9191
init?(dataArray: [Any],
9292
period: StatsPeriodUnit,
9393
periodIndex: Int,
94-
viewsIndex: Int,
95-
visitorsIndex: Int,
96-
likesIndex: Int,
97-
commentsIndex: Int) {
94+
viewsIndex: Int?,
95+
visitorsIndex: Int?,
96+
likesIndex: Int?,
97+
commentsIndex: Int?) {
98+
9899
guard
99100
let periodString = dataArray[periodIndex] as? String,
100-
let periodStart = type(of: self).parsedDate(from: periodString, for: period),
101-
let viewsCount = dataArray[viewsIndex] as? Int,
102-
let visitorsCount = dataArray[visitorsIndex] as? Int,
103-
let likesCount = dataArray[likesIndex] as? Int,
104-
let commentsCount = dataArray[commentsIndex] as? Int
105-
else {
101+
let periodStart = type(of: self).parsedDate(from: periodString, for: period) else {
106102
return nil
107103
}
108104

105+
let viewsCount: Int
106+
let visitorsCount: Int
107+
let likesCount: Int
108+
let commentsCount: Int
109+
110+
if let viewsIndex = viewsIndex {
111+
guard let count = dataArray[viewsIndex] as? Int else {
112+
return nil
113+
}
114+
viewsCount = count
115+
} else {
116+
viewsCount = 0
117+
}
118+
119+
if let visitorsIndex = visitorsIndex {
120+
guard let count = dataArray[visitorsIndex] as? Int else {
121+
return nil
122+
}
123+
visitorsCount = count
124+
} else {
125+
visitorsCount = 0
126+
}
127+
128+
if let likesIndex = likesIndex {
129+
guard let count = dataArray[likesIndex] as? Int else {
130+
return nil
131+
}
132+
likesCount = count
133+
} else {
134+
likesCount = 0
135+
}
136+
137+
if let commentsIndex = commentsIndex {
138+
guard let count = dataArray[commentsIndex] as? Int else {
139+
return nil
140+
}
141+
commentsCount = count
142+
} else {
143+
commentsCount = 0
144+
}
145+
109146
self.period = period
110147
self.periodStartDate = periodStart
148+
111149
self.viewsCount = viewsCount
112150
self.visitorsCount = visitorsCount
113151
self.likesCount = likesCount
@@ -146,3 +184,63 @@ private extension StatsSummaryData {
146184
return df
147185
}
148186
}
187+
188+
189+
/// So this is very awkward and neccessiated by our API. Turns out, calculating likes
190+
/// for long periods of times (months/years) on large sites takes _ages_ (up to a minute sometimes).
191+
/// Thankfully, calculating views/visitors/comments takes a much shorter time. (~2s, which is still suuuuuper long, but acceptable.)
192+
/// We don't want to wait a whole minute to display the rest of the data, so we fetch the likes separately.
193+
public struct StatsLikesSummaryTimeIntervalData {
194+
195+
public let period: StatsPeriodUnit
196+
public let periodEndDate: Date
197+
198+
public let summaryData: [StatsSummaryData]
199+
200+
public init(period: StatsPeriodUnit,
201+
periodEndDate: Date,
202+
summaryData: [StatsSummaryData]) {
203+
self.period = period
204+
self.periodEndDate = periodEndDate
205+
self.summaryData = summaryData
206+
}
207+
}
208+
209+
extension StatsLikesSummaryTimeIntervalData: StatsTimeIntervalData {
210+
211+
public static var pathComponent: String {
212+
return "stats/visits"
213+
}
214+
215+
public static func queryProperties(with date: Date, period: StatsPeriodUnit, maxCount: Int) -> [String : String] {
216+
return ["unit": period.stringValue,
217+
"quantity": String(maxCount),
218+
"stat_fields": "likes"]
219+
}
220+
221+
public init?(date: Date, period: StatsPeriodUnit, jsonDictionary: [String : AnyObject]) {
222+
guard
223+
let fieldsArray = jsonDictionary["fields"] as? [String],
224+
let data = jsonDictionary["data"] as? [[Any]]
225+
else {
226+
return nil
227+
}
228+
229+
guard
230+
let periodIndex = fieldsArray.firstIndex(of: "period"),
231+
let likesIndex = fieldsArray.firstIndex(of: "likes") else {
232+
return nil
233+
}
234+
235+
self.period = period
236+
self.periodEndDate = date
237+
self.summaryData = data.compactMap { StatsSummaryData(dataArray: $0,
238+
period: period,
239+
periodIndex: periodIndex,
240+
viewsIndex: nil,
241+
visitorsIndex: nil,
242+
likesIndex: likesIndex,
243+
commentsIndex: nil) }
244+
}
245+
}
246+

WordPressKitTests/StatsRemoteV2Tests.swift

Lines changed: 45 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -381,15 +381,15 @@ class StatsRemoteV2Tests: RemoteTestCase, RESTTestable {
381381

382382
XCTAssertEqual(summary?.summaryData[0].viewsCount, 5140)
383383
XCTAssertEqual(summary?.summaryData[0].visitorsCount, 3560)
384-
XCTAssertEqual(summary?.summaryData[0].likesCount, 70)
384+
XCTAssertEqual(summary?.summaryData[0].likesCount, 0)
385385
XCTAssertEqual(summary?.summaryData[0].commentsCount, 1)
386386

387387
let nineDaysAgo = Calendar.autoupdatingCurrent.date(byAdding: .day, value: -9, to: date)!
388388
XCTAssertEqual(summary?.summaryData[0].periodStartDate, nineDaysAgo)
389389

390390
XCTAssertEqual(summary?.summaryData[9].viewsCount, 3244)
391391
XCTAssertEqual(summary?.summaryData[9].visitorsCount, 2127)
392-
XCTAssertEqual(summary?.summaryData[9].likesCount, 25)
392+
XCTAssertEqual(summary?.summaryData[9].likesCount, 0)
393393
XCTAssertEqual(summary?.summaryData[9].commentsCount, 0)
394394
XCTAssertEqual(summary?.summaryData[9].periodStartDate, date)
395395

@@ -490,7 +490,7 @@ class StatsRemoteV2Tests: RemoteTestCase, RESTTestable {
490490

491491
XCTAssertEqual(summary?.summaryData[0].viewsCount, 32603)
492492
XCTAssertEqual(summary?.summaryData[0].visitorsCount, 23205)
493-
XCTAssertEqual(summary?.summaryData[0].likesCount, 855)
493+
XCTAssertEqual(summary?.summaryData[0].likesCount, 0)
494494
XCTAssertEqual(summary?.summaryData[0].commentsCount, 44)
495495

496496
let dec17 = DateComponents(year: 2018, month: 12, day: 17)
@@ -499,7 +499,7 @@ class StatsRemoteV2Tests: RemoteTestCase, RESTTestable {
499499

500500
XCTAssertEqual(summary?.summaryData[9].viewsCount, 17162)
501501
XCTAssertEqual(summary?.summaryData[9].visitorsCount, 11490)
502-
XCTAssertEqual(summary?.summaryData[9].likesCount, 126)
502+
XCTAssertEqual(summary?.summaryData[9].likesCount, 0)
503503
XCTAssertEqual(summary?.summaryData[9].commentsCount, 0)
504504

505505
XCTAssertEqual(summary?.summaryData[9].periodStartDate, Calendar.autoupdatingCurrent.date(byAdding: .day,
@@ -529,7 +529,7 @@ class StatsRemoteV2Tests: RemoteTestCase, RESTTestable {
529529

530530
XCTAssertEqual(summary?.summaryData[0].viewsCount, 3496)
531531
XCTAssertEqual(summary?.summaryData[0].visitorsCount, 398)
532-
XCTAssertEqual(summary?.summaryData[0].likesCount, 72)
532+
XCTAssertEqual(summary?.summaryData[0].likesCount, 0)
533533
XCTAssertEqual(summary?.summaryData[0].commentsCount, 0)
534534

535535
let may1 = DateComponents(year: 2018, month: 5, day: 1)
@@ -538,7 +538,7 @@ class StatsRemoteV2Tests: RemoteTestCase, RESTTestable {
538538

539539
XCTAssertEqual(summary?.summaryData[9].viewsCount, 2569)
540540
XCTAssertEqual(summary?.summaryData[9].visitorsCount, 334)
541-
XCTAssertEqual(summary?.summaryData[9].likesCount, 116)
541+
XCTAssertEqual(summary?.summaryData[9].likesCount, 0)
542542
XCTAssertEqual(summary?.summaryData[9].commentsCount, 0)
543543

544544
let nineMonthsFromMay1 = Calendar.autoupdatingCurrent.date(byAdding: .month, value: 9, to: may1Date)!
@@ -550,4 +550,43 @@ class StatsRemoteV2Tests: RemoteTestCase, RESTTestable {
550550

551551
waitForExpectations(timeout: timeout, handler: nil)
552552
}
553+
554+
func testLikesForMonth() {
555+
let expect = expectation(description: "It should return likes data for a month")
556+
557+
stubRemoteResponse(siteVisitsDataEndpoint, filename: getVisitsMonthMockFilename, contentType: .ApplicationJSON)
558+
559+
let feb21 = DateComponents(year: 2019, month: 2, day: 21)
560+
let date = Calendar.autoupdatingCurrent.date(from: feb21)!
561+
562+
563+
remote.getData(for: .month, endingOn: date) { (summary: StatsLikesSummaryTimeIntervalData?, error: Error?) in
564+
XCTAssertNil(error)
565+
XCTAssertNotNil(summary)
566+
567+
XCTAssertEqual(summary?.summaryData.count, 10)
568+
569+
XCTAssertEqual(summary?.summaryData[0].viewsCount, 0)
570+
XCTAssertEqual(summary?.summaryData[0].visitorsCount, 0)
571+
XCTAssertEqual(summary?.summaryData[0].likesCount, 72)
572+
XCTAssertEqual(summary?.summaryData[0].commentsCount, 0)
573+
574+
let may1 = DateComponents(year: 2018, month: 5, day: 1)
575+
let may1Date = Calendar.autoupdatingCurrent.date(from: may1)!
576+
XCTAssertEqual(summary?.summaryData[0].periodStartDate, may1Date)
577+
578+
XCTAssertEqual(summary?.summaryData[9].viewsCount, 0)
579+
XCTAssertEqual(summary?.summaryData[9].visitorsCount, 0)
580+
XCTAssertEqual(summary?.summaryData[9].likesCount, 116)
581+
XCTAssertEqual(summary?.summaryData[9].commentsCount, 0)
582+
583+
let nineMonthsFromMay1 = Calendar.autoupdatingCurrent.date(byAdding: .month, value: 9, to: may1Date)!
584+
585+
XCTAssertEqual(summary?.summaryData[9].periodStartDate, nineMonthsFromMay1)
586+
587+
expect.fulfill()
588+
}
589+
590+
waitForExpectations(timeout: timeout, handler: nil)
591+
}
553592
}

0 commit comments

Comments
 (0)