-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathFetchRaport.java
More file actions
129 lines (109 loc) · 7.23 KB
/
Copy pathFetchRaport.java
File metadata and controls
129 lines (109 loc) · 7.23 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
/**
* Yearly market report for a single role — up to 3 calendar years, oldest first.
* There is no `fields` parameter here: the report always comes back whole.
*/
public class FetchRaport {
private static final String CAMPAIGN = "java-raport";
private static final String ROLE = "ManualTester";
public static void main(String[] args) throws Exception {
var client = new SolidJobsClient();
var body = client.fetchMarketRaport(ROLE, CAMPAIGN);
System.out.println("Role: " + JsonHelper.getString(body, "scopeKey"));
System.out.println("Generated at: " + JsonHelper.getString(body, "generatedAt"));
var years = JsonHelper.extractArray(body, "years");
var yearObjects = years == null ? java.util.List.<String>of() : JsonHelper.getObjectsInArray(years);
System.out.println("Years: " + yearObjects.size());
for (var year : yearObjects) {
printYear(year);
}
}
private static void printYear(String year) {
long offerCount = JsonHelper.getLong(year, "offerCount");
System.out.printf("%n[%d] offerCount=%d%n", JsonHelper.getLong(year, "year"), offerCount);
// NOTE: every "total" below is an independent denominator — none of them equal offerCount
// or each other. Offers proposing neither B2B nor a permanent contract fall outside
// contractType, and offers with no declared experience level fall outside seniority.
var contract = JsonHelper.extractObject(year, "contractType");
long contractTotal = JsonHelper.getLong(contract, "total");
System.out.printf(" contractType (total=%d, offerCount=%d):%n", contractTotal, offerCount);
printBucket("b2bOnly", JsonHelper.extractObject(contract, "b2bOnly"), contractTotal);
printBucket("permanentOnly", JsonHelper.extractObject(contract, "permanentOnly"), contractTotal);
printBucket("both", JsonHelper.extractObject(contract, "both"), contractTotal);
var seniority = JsonHelper.extractObject(year, "seniority");
long seniorityTotal = JsonHelper.getLong(seniority, "total");
System.out.printf(" seniority (total=%d, offerCount=%d):%n", seniorityTotal, offerCount);
printSeniorityNode("junior", JsonHelper.extractObject(seniority, "junior"));
printSeniorityNode("regular", JsonHelper.extractObject(seniority, "regular"));
printSeniorityNode("senior", JsonHelper.extractObject(seniority, "senior"));
System.out.println(" salary (PLN, per seniority - lower..upper band):");
printSalary("B2B", JsonHelper.extractObject(year, "salaryB2B"));
printSalary("UoP", JsonHelper.extractObject(year, "salaryUoP"));
var topSkills = JsonHelper.extractArray(year, "topSkills");
var skillObjects = topSkills == null ? java.util.List.<String>of() : JsonHelper.getObjectsInArray(topSkills);
System.out.printf(" topSkills (%d):%n", skillObjects.size());
for (int i = 0; i < skillObjects.size() && i < 10; i++) {
var skill = skillObjects.get(i);
System.out.printf(" %-20s %d offers%n", JsonHelper.getString(skill, "name"), JsonHelper.getLong(skill, "count"));
}
var quarters = JsonHelper.extractArray(year, "quarters");
var quarterObjects = quarters == null ? java.util.List.<String>of() : JsonHelper.getObjectsInArray(quarters);
System.out.printf(" quarters (%d):%n", quarterObjects.size());
for (var quarter : quarterObjects) {
printQuarter(quarter);
}
}
private static void printQuarter(String quarter) {
long qOfferCount = JsonHelper.getLong(quarter, "offerCount");
System.out.printf(" Q%d offerCount=%d%n", JsonHelper.getLong(quarter, "quarter"), qOfferCount);
// Same independent-denominator caveat as at year level, scoped to the quarter.
var contract = JsonHelper.extractObject(quarter, "contractType");
long contractTotal = JsonHelper.getLong(contract, "total");
System.out.printf(" contractType (total=%d, offerCount=%d):%n", contractTotal, qOfferCount);
printBucket("b2bOnly", JsonHelper.extractObject(contract, "b2bOnly"), contractTotal);
printBucket("permanentOnly", JsonHelper.extractObject(contract, "permanentOnly"), contractTotal);
printBucket("both", JsonHelper.extractObject(contract, "both"), contractTotal);
var seniority = JsonHelper.extractObject(quarter, "seniority");
long seniorityTotal = JsonHelper.getLong(seniority, "total");
System.out.printf(" seniority (total=%d, offerCount=%d):%n", seniorityTotal, qOfferCount);
printSeniorityNode("junior", JsonHelper.extractObject(seniority, "junior"));
printSeniorityNode("regular", JsonHelper.extractObject(seniority, "regular"));
printSeniorityNode("senior", JsonHelper.extractObject(seniority, "senior"));
System.out.println(" salary (PLN, per seniority - lower..upper band):");
printSalary("B2B", JsonHelper.extractObject(quarter, "salaryB2B"));
printSalary("UoP", JsonHelper.extractObject(quarter, "salaryUoP"));
}
private static void printBucket(String label, String bucket, long total) {
System.out.printf(" %-16s %5d offers (%d%% of %d)%n",
label, JsonHelper.getLong(bucket, "count"), JsonHelper.getLong(bucket, "percentage"), total);
}
private static void printSeniorityNode(String label, String node) {
System.out.printf(" %-16s %5d offers (%d%% of seniority.total)%n",
label, JsonHelper.getLong(node, "count"), JsonHelper.getLong(node, "percentage"));
// Nested contractType has its own independent total — not the seniority level's count.
var contract = JsonHelper.extractObject(node, "contractType");
long total = JsonHelper.getLong(contract, "total");
printBucket(" b2bOnly", JsonHelper.extractObject(contract, "b2bOnly"), total);
printBucket(" permanentOnly", JsonHelper.extractObject(contract, "permanentOnly"), total);
printBucket(" both", JsonHelper.extractObject(contract, "both"), total);
}
private static void printSalary(String label, String salary) {
// salaryB2B / salaryUoP are omitted entirely when the year has no data at all for that contract type.
if (salary == null) {
System.out.printf(" %s: (no data for this year)%n", label);
return;
}
printSalaryBand(label + " junior", JsonHelper.extractObject(salary, "junior"));
printSalaryBand(label + " regular", JsonHelper.extractObject(salary, "regular"));
printSalaryBand(label + " senior", JsonHelper.extractObject(salary, "senior"));
}
private static void printSalaryBand(String label, String band) {
// Zero fields mean this seniority has no salary data that year — the object is still present.
System.out.printf(" %-14s median=%.0f..%.0f average=%.0f..%.0f ranges=%d%n",
label,
JsonHelper.getDouble(band, "medianLower"),
JsonHelper.getDouble(band, "medianUpper"),
JsonHelper.getDouble(band, "averageLower"),
JsonHelper.getDouble(band, "averageUpper"),
JsonHelper.getLong(band, "salaryRangeCount"));
}
}