Skip to content

Commit d1d0203

Browse files
ev charging larger data set and inrease page size.
1 parent 21bb8d8 commit d1d0203

File tree

13 files changed

+1607
-18
lines changed

13 files changed

+1607
-18
lines changed

SharpGraph.sln

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,10 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SharpGraph.Benchmark", "src
1717
EndProject
1818
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SharpGraph.Ide", "src\SharpGraph.Ide\SharpGraph.Ide.csproj", "{409B2A30-9F09-41CB-8504-2A96ECD15356}"
1919
EndProject
20+
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "examples", "examples", "{B36A84DF-456D-A817-6EDD-3EC3E7F6E11F}"
21+
EndProject
22+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EVCharging", "examples\EVCharging\EVCharging.csproj", "{872DC64F-91CB-48AC-A4E5-79334BB0E6C3}"
23+
EndProject
2024
Global
2125
GlobalSection(SolutionConfigurationPlatforms) = preSolution
2226
Debug|Any CPU = Debug|Any CPU
@@ -83,12 +87,25 @@ Global
8387
{409B2A30-9F09-41CB-8504-2A96ECD15356}.Release|x64.Build.0 = Release|Any CPU
8488
{409B2A30-9F09-41CB-8504-2A96ECD15356}.Release|x86.ActiveCfg = Release|Any CPU
8589
{409B2A30-9F09-41CB-8504-2A96ECD15356}.Release|x86.Build.0 = Release|Any CPU
90+
{872DC64F-91CB-48AC-A4E5-79334BB0E6C3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
91+
{872DC64F-91CB-48AC-A4E5-79334BB0E6C3}.Debug|Any CPU.Build.0 = Debug|Any CPU
92+
{872DC64F-91CB-48AC-A4E5-79334BB0E6C3}.Debug|x64.ActiveCfg = Debug|Any CPU
93+
{872DC64F-91CB-48AC-A4E5-79334BB0E6C3}.Debug|x64.Build.0 = Debug|Any CPU
94+
{872DC64F-91CB-48AC-A4E5-79334BB0E6C3}.Debug|x86.ActiveCfg = Debug|Any CPU
95+
{872DC64F-91CB-48AC-A4E5-79334BB0E6C3}.Debug|x86.Build.0 = Debug|Any CPU
96+
{872DC64F-91CB-48AC-A4E5-79334BB0E6C3}.Release|Any CPU.ActiveCfg = Release|Any CPU
97+
{872DC64F-91CB-48AC-A4E5-79334BB0E6C3}.Release|Any CPU.Build.0 = Release|Any CPU
98+
{872DC64F-91CB-48AC-A4E5-79334BB0E6C3}.Release|x64.ActiveCfg = Release|Any CPU
99+
{872DC64F-91CB-48AC-A4E5-79334BB0E6C3}.Release|x64.Build.0 = Release|Any CPU
100+
{872DC64F-91CB-48AC-A4E5-79334BB0E6C3}.Release|x86.ActiveCfg = Release|Any CPU
101+
{872DC64F-91CB-48AC-A4E5-79334BB0E6C3}.Release|x86.Build.0 = Release|Any CPU
86102
EndGlobalSection
87103
GlobalSection(SolutionProperties) = preSolution
88104
HideSolutionNode = FALSE
89105
EndGlobalSection
90106
GlobalSection(NestedProjects) = preSolution
91107
{28FB2365-E62B-4EE6-B0D7-CCA3C1FB3FAD} = {827E0CD3-B72D-47B6-A68D-7590B98EB39B}
92108
{409B2A30-9F09-41CB-8504-2A96ECD15356} = {827E0CD3-B72D-47B6-A68D-7590B98EB39B}
109+
{872DC64F-91CB-48AC-A4E5-79334BB0E6C3} = {B36A84DF-456D-A817-6EDD-3EC3E7F6E11F}
93110
EndGlobalSection
94111
EndGlobal
Lines changed: 336 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,336 @@
1+
using System.Text.Json;
2+
3+
namespace EVCharging;
4+
5+
public class DataGenerator
6+
{
7+
private readonly Random _random;
8+
9+
public DataGenerator(int seed = 42)
10+
{
11+
_random = new Random(seed); // Fixed seed for reproducibility
12+
}
13+
14+
public string GenerateAllData()
15+
{
16+
Console.WriteLine("🔧 Generating 100,000+ records...");
17+
18+
var persons = GeneratePersons(10000);
19+
var chargeCards = GenerateChargeCards(10000);
20+
var chargeTokens = GenerateChargeTokens(50000, 10000);
21+
var chargeStations = GenerateChargeStations(500);
22+
var connectors = GenerateConnectors(500);
23+
var chargeSessions = GenerateChargeSessions(100000, 50000, 2000);
24+
var chargeDetailRecords = GenerateChargeDetailRecords(100000, 50000, 2000);
25+
26+
var data = new
27+
{
28+
Person = persons,
29+
ChargeCard = chargeCards,
30+
ChargeToken = chargeTokens,
31+
ChargeStation = chargeStations,
32+
Connector = connectors,
33+
ChargeSession = chargeSessions,
34+
ChargeDetailRecord = chargeDetailRecords
35+
};
36+
37+
return JsonSerializer.Serialize(data, new JsonSerializerOptions { WriteIndented = true });
38+
}
39+
40+
public string GenerateServerData()
41+
{
42+
Console.WriteLine("🔧 Generating 10,000 records (server-friendly size)...");
43+
44+
var persons = GeneratePersons(1000);
45+
var chargeCards = GenerateChargeCards(1000);
46+
var chargeTokens = GenerateChargeTokens(5000, 1000);
47+
var chargeStations = GenerateChargeStations(100);
48+
var connectors = GenerateConnectors(100);
49+
var chargeSessions = GenerateChargeSessions(10000, 5000, 400);
50+
var chargeDetailRecords = GenerateChargeDetailRecords(10000, 5000, 400);
51+
52+
var data = new
53+
{
54+
Person = persons,
55+
ChargeCard = chargeCards,
56+
ChargeToken = chargeTokens,
57+
ChargeStation = chargeStations,
58+
Connector = connectors,
59+
ChargeSession = chargeSessions,
60+
ChargeDetailRecord = chargeDetailRecords
61+
};
62+
63+
return JsonSerializer.Serialize(data, new JsonSerializerOptions { WriteIndented = true });
64+
}
65+
66+
private List<object> GeneratePersons(int count)
67+
{
68+
Console.WriteLine($" 👥 Generating {count:N0} persons...");
69+
var persons = new List<object>();
70+
var firstNames = new[] { "John", "Emma", "Michael", "Sophia", "William", "Olivia", "James", "Ava", "Robert", "Isabella", "Lucas", "Mia", "Alexander", "Charlotte", "Henry" };
71+
var lastNames = new[] { "Smith", "Johnson", "Williams", "Brown", "Jones", "Garcia", "Miller", "Davis", "Rodriguez", "Martinez", "Wilson", "Anderson", "Taylor", "Thomas", "Moore" };
72+
var cities = new[] { "Amsterdam", "Rotterdam", "Utrecht", "The Hague", "Eindhoven", "Brussels", "Antwerp", "Paris", "Berlin", "London" };
73+
var countries = new[] { "Netherlands", "Belgium", "France", "Germany", "UK" };
74+
var statuses = new[] { "active", "active", "active", "active", "suspended" };
75+
76+
for (int i = 1; i <= count; i++)
77+
{
78+
var firstName = firstNames[_random.Next(firstNames.Length)];
79+
var lastName = lastNames[_random.Next(lastNames.Length)];
80+
var city = cities[_random.Next(cities.Length)];
81+
82+
persons.Add(new
83+
{
84+
id = $"person-{i}",
85+
name = $"{firstName} {lastName}",
86+
email = $"driver{i}@example.com",
87+
phone = $"+31{_random.Next(600000000, 699999999)}",
88+
address = $"{_random.Next(1, 999)} Main Street",
89+
city = city,
90+
country = countries[_random.Next(countries.Length)],
91+
registrationDate = GenerateRandomDate(2020, 2025),
92+
status = statuses[_random.Next(statuses.Length)]
93+
});
94+
}
95+
return persons;
96+
}
97+
98+
private List<object> GenerateChargeCards(int count)
99+
{
100+
Console.WriteLine($" 💳 Generating {count:N0} charge cards...");
101+
var cards = new List<object>();
102+
var cardTypes = new[] { "RFID", "Mobile", "Credit", "Debit" };
103+
var issuers = new[] { "ChargePoint", "Shell Recharge", "Fastned", "IONITY", "Tesla" };
104+
var statuses = new[] { "active", "active", "active", "blocked", "expired" };
105+
106+
for (int i = 1; i <= count; i++)
107+
{
108+
cards.Add(new
109+
{
110+
id = $"card-{i}",
111+
personId = $"person-{i}",
112+
cardNumber = $"NL-{_random.Next(1000, 9999)}-{_random.Next(1000, 9999)}-{_random.Next(1000, 9999)}",
113+
cardType = cardTypes[_random.Next(cardTypes.Length)],
114+
issuer = issuers[_random.Next(issuers.Length)],
115+
expiryDate = GenerateRandomDate(2025, 2030),
116+
status = statuses[_random.Next(statuses.Length)],
117+
issuedDate = GenerateRandomDate(2020, 2024)
118+
});
119+
}
120+
return cards;
121+
}
122+
123+
private List<object> GenerateChargeTokens(int count, int cardCount)
124+
{
125+
Console.WriteLine($" 🎫 Generating {count:N0} charge tokens...");
126+
var tokens = new List<object>();
127+
var tokenTypes = new[] { "RFID", "NFC", "QR", "App", "Credit" };
128+
var statuses = new[] { "active", "active", "active", "active", "blocked" };
129+
130+
for (int i = 1; i <= count; i++)
131+
{
132+
var cardId = _random.Next(1, cardCount + 1);
133+
tokens.Add(new
134+
{
135+
id = $"token-{i}",
136+
chargeCardId = $"card-{cardId}",
137+
tokenIdentifier = $"TOK{_random.Next(100000000, 999999999)}",
138+
tokenType = tokenTypes[_random.Next(tokenTypes.Length)],
139+
visualNumber = $"{_random.Next(1000, 9999)} **** {_random.Next(1000, 9999)}",
140+
status = statuses[_random.Next(statuses.Length)],
141+
activatedDate = GenerateRandomDate(2020, 2025),
142+
lastUsed = GenerateRandomDate(2024, 2025)
143+
});
144+
}
145+
return tokens;
146+
}
147+
148+
private List<object> GenerateChargeStations(int count)
149+
{
150+
Console.WriteLine($" 🔌 Generating {count:N0} charge stations...");
151+
var stations = new List<object>();
152+
var operators = new[] { "Fastned", "IONITY", "Shell Recharge", "Allego", "ChargePoint", "Tesla Supercharger" };
153+
var cities = new[] { "Amsterdam", "Rotterdam", "Utrecht", "The Hague", "Eindhoven", "Brussels", "Antwerp", "Paris", "Berlin", "London" };
154+
var statuses = new[] { "operational", "operational", "operational", "maintenance", "offline" };
155+
156+
for (int i = 1; i <= count; i++)
157+
{
158+
var city = cities[_random.Next(cities.Length)];
159+
var totalConn = _random.Next(4, 13);
160+
161+
stations.Add(new
162+
{
163+
id = $"station-{i}",
164+
name = $"{city} Station {i}",
165+
@operator = operators[_random.Next(operators.Length)],
166+
location = $"{city} {(_random.Next(2) == 0 ? "North" : "South")}",
167+
address = $"{_random.Next(1, 500)} Highway A{_random.Next(1, 20)}",
168+
city = city,
169+
country = DetermineCityCountry(city),
170+
latitude = 48.0 + _random.NextDouble() * 5.0,
171+
longitude = 2.0 + _random.NextDouble() * 8.0,
172+
status = statuses[_random.Next(statuses.Length)],
173+
totalConnectors = totalConn,
174+
availableConnectors = _random.Next(0, totalConn + 1),
175+
openingHours = "24/7"
176+
});
177+
}
178+
return stations;
179+
}
180+
181+
private List<object> GenerateConnectors(int stationCount)
182+
{
183+
Console.WriteLine($" 🔌 Generating ~2000 connectors...");
184+
var connectors = new List<object>();
185+
var connectorTypes = new[] { "Type2", "CCS", "CHAdeMO", "Tesla" };
186+
var statuses = new[] { "available", "available", "occupied", "faulted", "reserved" };
187+
188+
int connectorId = 1;
189+
for (int stationId = 1; stationId <= stationCount; stationId++)
190+
{
191+
int connectorCount = _random.Next(2, 6);
192+
193+
for (int connNum = 1; connNum <= connectorCount; connNum++)
194+
{
195+
var connType = connectorTypes[_random.Next(connectorTypes.Length)];
196+
var powerType = connType == "Type2" ? "AC" : "DC";
197+
var maxPower = powerType == "AC" ? 22.0 : (_random.Next(2) == 0 ? 50.0 : 150.0);
198+
199+
connectors.Add(new
200+
{
201+
id = $"connector-{connectorId}",
202+
chargeStationId = $"station-{stationId}",
203+
connectorNumber = connNum,
204+
connectorType = connType,
205+
powerType = powerType,
206+
maxPower = maxPower,
207+
voltage = powerType == "AC" ? 230 : 400,
208+
amperage = powerType == "AC" ? 32 : 125,
209+
status = statuses[_random.Next(statuses.Length)],
210+
pricePerKwh = Math.Round(0.25 + _random.NextDouble() * 0.30, 3),
211+
pricePerMinute = Math.Round(_random.NextDouble() * 0.10, 3)
212+
});
213+
connectorId++;
214+
}
215+
}
216+
return connectors;
217+
}
218+
219+
private List<object> GenerateChargeSessions(int count, int tokenCount, int connectorCount)
220+
{
221+
Console.WriteLine($" ⚡ Generating {count:N0} charge sessions...");
222+
var sessions = new List<object>();
223+
var statuses = new[] { "completed", "completed", "completed", "charging", "failed" };
224+
var authMethods = new[] { "RFID", "App", "QR", "Credit" };
225+
226+
for (int i = 1; i <= count; i++)
227+
{
228+
var status = statuses[_random.Next(statuses.Length)];
229+
var startTime = GenerateRandomDateTime(2024, 2025);
230+
var duration = _random.Next(15, 480);
231+
232+
var connectorId = _random.Next(1, connectorCount + 1);
233+
var stationId = (connectorId - 1) / 4 + 1;
234+
235+
sessions.Add(new
236+
{
237+
id = $"session-{i}",
238+
chargeTokenId = $"token-{_random.Next(1, tokenCount + 1)}",
239+
connectorId = $"connector-{connectorId}",
240+
chargeStationId = $"station-{stationId}",
241+
status = status,
242+
startTime = startTime,
243+
endTime = status == "completed" ? AddMinutes(startTime, duration) : null,
244+
authMethod = authMethods[_random.Next(authMethods.Length)],
245+
meterStartValue = Math.Round(_random.NextDouble() * 100000.0, 2),
246+
meterEndValue = status == "completed" ? Math.Round(_random.NextDouble() * 100000.0 + 50.0, 2) : (double?)null,
247+
reservationId = _random.Next(100) < 20 ? $"RES{_random.Next(100000, 999999)}" : null
248+
});
249+
}
250+
return sessions;
251+
}
252+
253+
private List<object> GenerateChargeDetailRecords(int count, int tokenCount, int connectorCount)
254+
{
255+
Console.WriteLine($" 📊 Generating {count:N0} charge detail records (CDRs)...");
256+
var cdrs = new List<object>();
257+
var statuses = new[] { "completed", "completed", "completed", "failed", "disputed" };
258+
var authMethods = new[] { "RFID", "App", "QR", "Credit" };
259+
var currencies = new[] { "EUR", "EUR", "EUR", "GBP", "USD" };
260+
261+
for (int i = 1; i <= count; i++)
262+
{
263+
var startTime = GenerateRandomDateTime(2024, 2025);
264+
var duration = _random.Next(15, 480);
265+
var endTime = AddMinutes(startTime, duration);
266+
267+
var energyDelivered = _random.Next(5, 85) + _random.NextDouble();
268+
var pricePerKwh = 0.25 + _random.NextDouble() * 0.30;
269+
var totalCost = energyDelivered * pricePerKwh;
270+
271+
var connectorId = _random.Next(1, connectorCount + 1);
272+
var stationId = (connectorId - 1) / 4 + 1;
273+
274+
cdrs.Add(new
275+
{
276+
id = $"cdr-{i}",
277+
chargeSessionId = $"session-{i}",
278+
chargeTokenId = $"token-{_random.Next(1, tokenCount + 1)}",
279+
connectorId = $"connector-{connectorId}",
280+
chargeStationId = $"station-{stationId}",
281+
startTime = startTime,
282+
endTime = endTime,
283+
duration = duration,
284+
energyDelivered = Math.Round(energyDelivered, 2),
285+
meterStartValue = Math.Round(_random.NextDouble() * 100000.0, 2),
286+
meterEndValue = Math.Round(_random.NextDouble() * 100000.0 + energyDelivered, 2),
287+
pricePerKwh = Math.Round(pricePerKwh, 3),
288+
totalCost = Math.Round(totalCost, 2),
289+
currency = currencies[_random.Next(currencies.Length)],
290+
status = statuses[_random.Next(statuses.Length)],
291+
authMethod = authMethods[_random.Next(authMethods.Length)],
292+
tariffDescription = $"Standard Rate - {Math.Round(pricePerKwh, 2)} per kWh"
293+
});
294+
}
295+
return cdrs;
296+
}
297+
298+
private string GenerateRandomDate(int startYear, int endYear)
299+
{
300+
var start = new DateTime(startYear, 1, 1);
301+
var end = new DateTime(endYear, 12, 31);
302+
var range = (end - start).Days;
303+
return start.AddDays(_random.Next(range)).ToString("yyyy-MM-dd");
304+
}
305+
306+
private string GenerateRandomDateTime(int startYear, int endYear)
307+
{
308+
var start = new DateTime(startYear, 1, 1);
309+
var end = new DateTime(endYear, 12, 31);
310+
var range = (end - start).Days;
311+
var date = start.AddDays(_random.Next(range));
312+
var hour = _random.Next(0, 24);
313+
var minute = _random.Next(0, 60);
314+
var second = _random.Next(0, 60);
315+
return new DateTime(date.Year, date.Month, date.Day, hour, minute, second).ToString("yyyy-MM-ddTHH:mm:ssZ");
316+
}
317+
318+
private string AddMinutes(string dateTime, int minutes)
319+
{
320+
var dt = DateTime.Parse(dateTime);
321+
return dt.AddMinutes(minutes).ToString("yyyy-MM-ddTHH:mm:ssZ");
322+
}
323+
324+
private string DetermineCityCountry(string city)
325+
{
326+
return city switch
327+
{
328+
"Amsterdam" or "Rotterdam" or "Utrecht" or "The Hague" or "Eindhoven" => "Netherlands",
329+
"Brussels" or "Antwerp" => "Belgium",
330+
"Paris" => "France",
331+
"Berlin" => "Germany",
332+
"London" => "UK",
333+
_ => "Netherlands"
334+
};
335+
}
336+
}

0 commit comments

Comments
 (0)