Skip to content

Commit fe33de1

Browse files
authored
Merge pull request #8162 from woocommerce/issue/8156-orders-analytics-storage
[Analytics Hub] Add Storage support for Average Order Value analytics
2 parents 207ea58 + 008f233 commit fe33de1

File tree

8 files changed

+896
-5
lines changed

8 files changed

+896
-5
lines changed

Storage/Storage.xcodeproj/project.pbxproj

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -435,6 +435,7 @@
435435
CC6A054228770933002C144E /* OrderMetaData+CoreDataProperties.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "OrderMetaData+CoreDataProperties.swift"; sourceTree = "<group>"; };
436436
CCBEBD3F27C68E660010C96F /* FeatureIcon.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeatureIcon.swift; sourceTree = "<group>"; };
437437
CCD2E70625DE9AAA00BD975D /* WooCommerceModelV45toV46.xcmappingmodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcmappingmodel; path = WooCommerceModelV45toV46.xcmappingmodel; sourceTree = "<group>"; };
438+
CCF3209E2927EBEE002114B1 /* Model 78.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = "Model 78.xcdatamodel"; sourceTree = "<group>"; };
438439
CE12FBE22220515600C59248 /* WooCommerceModelV9toV10.xcmappingmodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcmappingmodel; path = WooCommerceModelV9toV10.xcmappingmodel; sourceTree = "<group>"; };
439440
CE3B7AD02225E62C0050FE4B /* OrderStatus+CoreDataClass.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "OrderStatus+CoreDataClass.swift"; sourceTree = "<group>"; };
440441
CE3B7AD12225E62C0050FE4B /* OrderStatus+CoreDataProperties.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "OrderStatus+CoreDataProperties.swift"; sourceTree = "<group>"; };
@@ -1815,6 +1816,7 @@
18151816
DEC51AA4275B41BE009F3DF4 /* WooCommerce.xcdatamodeld */ = {
18161817
isa = XCVersionGroup;
18171818
children = (
1819+
CCF3209E2927EBEE002114B1 /* Model 78.xcdatamodel */,
18181820
AE7DF9FA2919023100C4D1ED /* Model 77.xcdatamodel */,
18191821
AEC4481B290853C300BAA299 /* Model 76.xcdatamodel */,
18201822
688908A328F8EB360081A07E /* Model 75.xcdatamodel */,
@@ -1893,7 +1895,7 @@
18931895
DEC51ADE275B41BE009F3DF4 /* Model 47.xcdatamodel */,
18941896
DEC51ADF275B41BE009F3DF4 /* Model 19.xcdatamodel */,
18951897
);
1896-
currentVersion = AE7DF9FA2919023100C4D1ED /* Model 77.xcdatamodel */;
1898+
currentVersion = CCF3209E2927EBEE002114B1 /* Model 78.xcdatamodel */;
18971899
path = WooCommerce.xcdatamodeld;
18981900
sourceTree = "<group>";
18991901
versionGroupType = wrapper.xcdatamodel;

Storage/Storage/Model/MIGRATIONS.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@
22

33
This file documents changes in the WCiOS Storage data model. Please explain any changes to the data model as well as any custom migrations.
44

5+
## Model 78 (Release 11.4.0.0)
6+
- @rachelmcr 2022-11-18
7+
- Added `averageOrderValue` attribute to `OrderStatsV4Totals` entity.
8+
59
## Model 77 (Release 11.2.0.0)
610
- @ealeksandrov 2022-11-07
711
- Added `frameNonce` attribute to `Site` entity.

Storage/Storage/Model/OrderStatsV4Totals+CoreDataProperties.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ extension OrderStatsV4Totals {
1818
@NSManaged public var shipping: NSDecimalNumber
1919
@NSManaged public var netRevenue: NSDecimalNumber
2020
@NSManaged public var totalProducts: Int64
21+
@NSManaged public var averageOrderValue: NSDecimalNumber
2122
@NSManaged public var interval: OrderStatsV4Interval?
2223
@NSManaged public var stats: OrderStatsV4?
2324
}

Storage/Storage/Model/WooCommerce.xcdatamodeld/.xccurrentversion

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,6 @@
33
<plist version="1.0">
44
<dict>
55
<key>_XCCurrentVersionName</key>
6-
<string>Model 77.xcdatamodel</string>
6+
<string>Model 78.xcdatamodel</string>
77
</dict>
88
</plist>

Storage/Storage/Model/WooCommerce.xcdatamodeld/Model 78.xcdatamodel/contents

Lines changed: 839 additions & 0 deletions
Large diffs are not rendered by default.

Storage/StorageTests/CoreData/MigrationTests.swift

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1496,6 +1496,34 @@ final class MigrationTests: XCTestCase {
14961496
let newFrameNonce = try XCTUnwrap(migratedSite.value(forKey: "frameNonce") as? String)
14971497
XCTAssertEqual(newFrameNonce, frameNonce)
14981498
}
1499+
1500+
func test_migrating_from_77_to_78_adds_averageOrderValue_attribute() throws {
1501+
// Given
1502+
let sourceContainer = try startPersistentContainer("Model 77")
1503+
let sourceContext = sourceContainer.viewContext
1504+
1505+
let orderStatsV4Totals = insertOrderStatsTotals(to: sourceContainer.viewContext)
1506+
try sourceContext.save()
1507+
1508+
XCTAssertNil(orderStatsV4Totals.entity.attributesByName["averageOrderValue"])
1509+
1510+
// When
1511+
let targetContainer = try migrate(sourceContainer, to: "Model 78")
1512+
let targetContext = targetContainer.viewContext
1513+
1514+
let migratedOrderStatsV4Totals = try XCTUnwrap(targetContext.first(entityName: "OrderStatsV4Totals"))
1515+
let defaultAverageOrderValue = try XCTUnwrap(migratedOrderStatsV4Totals.value(forKey: "averageOrderValue") as? Double)
1516+
1517+
let averageOrderValue = 123.45
1518+
migratedOrderStatsV4Totals.setValue(averageOrderValue, forKey: "averageOrderValue")
1519+
1520+
// Then
1521+
// Default value is 0.
1522+
XCTAssertEqual(defaultAverageOrderValue, 0)
1523+
1524+
let newAverageOrderValue = try XCTUnwrap(migratedOrderStatsV4Totals.value(forKey: "averageOrderValue") as? Double)
1525+
XCTAssertEqual(newAverageOrderValue, averageOrderValue)
1526+
}
14991527
}
15001528

15011529
// MARK: - Persistent Store Setup and Migrations
@@ -1891,6 +1919,22 @@ private extension MigrationTests {
18911919
])
18921920
}
18931921

1922+
@discardableResult
1923+
func insertOrderStatsTotals(to context: NSManagedObjectContext) -> NSManagedObject {
1924+
context.insert(entityName: "OrderStatsV4Totals", properties: [
1925+
"totalOrders": 3,
1926+
"totalItemsSold": 5,
1927+
"grossRevenue": 800,
1928+
"couponDiscount": 0,
1929+
"totalCoupons": 0,
1930+
"refunds": 0,
1931+
"taxes": 0,
1932+
"shipping": 0,
1933+
"netRevenue": 800,
1934+
"totalProducts": 2,
1935+
])
1936+
}
1937+
18941938
@discardableResult
18951939
func insertSiteVisitStats(to context: NSManagedObjectContext) -> NSManagedObject {
18961940
context.insert(entityName: "SiteVisitStats", properties: [

Yosemite/Yosemite/Model/Storage/OrderStatsV4Totals+ReadOnlyConvertible.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ extension Storage.OrderStatsV4Totals: ReadOnlyConvertible {
1919
shipping = NSDecimalNumber(decimal: statsTotals.shipping)
2020
netRevenue = NSDecimalNumber(decimal: statsTotals.netRevenue)
2121
totalProducts = Int64(statsTotals.totalProducts ?? 0)
22+
averageOrderValue = NSDecimalNumber(decimal: statsTotals.averageOrderValue)
2223
}
2324

2425
/// Returns a ReadOnly version of the receiver.
@@ -34,6 +35,6 @@ extension Storage.OrderStatsV4Totals: ReadOnlyConvertible {
3435
shipping: shipping.decimalValue,
3536
netRevenue: netRevenue.decimalValue,
3637
totalProducts: Int(totalProducts),
37-
averageOrderValue: 0) // TODO-8156: Update after Storage.OrderStatsV4Totals is updated
38+
averageOrderValue: averageOrderValue.decimalValue)
3839
}
3940
}

Yosemite/YosemiteTests/Stores/StatsStoreV4Tests.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -524,7 +524,7 @@ private extension StatsStoreV4Tests {
524524
shipping: 0,
525525
netRevenue: 800,
526526
totalProducts: 2,
527-
averageOrderValue: 0)
527+
averageOrderValue: 266)
528528
}
529529

530530
/// Matches the first interval's `subtotals` field in `order-stats-v4-year` response.
@@ -539,7 +539,7 @@ private extension StatsStoreV4Tests {
539539
shipping: 0,
540540
netRevenue: 800,
541541
totalProducts: 0,
542-
averageOrderValue: 0)
542+
averageOrderValue: 266)
543543
}
544544

545545
func sampleIntervals() -> [Networking.OrderStatsV4Interval] {

0 commit comments

Comments
 (0)