Last active
October 18, 2018 00:10
-
-
Save galenguyer/5e846da53983fb10e820c502f1eb780e to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System.Collections.Generic; | |
using System.Linq; | |
namespace LogParser | |
{ | |
public class LocationMap | |
{ | |
public class CountryNode | |
{ | |
public string name; | |
public List<RegionNode> regions = new List<RegionNode>(); | |
public CountryNode(string country, string region, string city, string ip, string request) | |
{ | |
name = country; | |
regions.Add(new RegionNode(region, city, ip, request)); | |
} | |
} | |
public class RegionNode | |
{ | |
public string name; | |
public List<CityNode> cities = new List<CityNode>(); | |
public RegionNode(string region, string city, string ip, string request) | |
{ | |
name = region; | |
cities.Add(new CityNode(city, ip, request)); | |
} | |
} | |
public class CityNode | |
{ | |
public string name; | |
public List<IpNode> ips = new List<IpNode>(); | |
public CityNode(string city, string ip, string request) | |
{ | |
name = city; | |
ips.Add(new IpNode(ip, request)); | |
} | |
} | |
public class IpNode | |
{ | |
public string name; | |
public List<RequestNode> requests = new List<RequestNode>(); | |
public IpNode(string ip, string request) | |
{ | |
name = ip; | |
requests.Add(new RequestNode(request)); | |
} | |
} | |
public class RequestNode | |
{ | |
public string name; | |
public int count; | |
public RequestNode(string request) | |
{ | |
name = request; | |
count = 1; | |
} | |
} | |
public List<CountryNode> countries = new List<CountryNode>(); | |
public override string ToString() | |
{ | |
int countryCount = 1; | |
string str = $"Total: {countries.Count()} countries - {countries.Sum(c => c.regions.Count())} states/regions - {countries.Sum(c => c.regions.Sum(r => r.cities.Count()))} cities - {countries.Sum(c => c.regions.Sum(r => r.cities.Sum(ci => ci.ips.Count())))} ips - {countries.Sum(c => c.regions.Sum(r => r.cities.Sum(ci => ci.ips.Sum(i => i.requests.Count()))))} unique requests - {countries.Sum(c => c.regions.Sum(r => r.cities.Sum(ci => ci.ips.Sum(i => i.requests.Sum(re => re.count)))))} total requests\n"; | |
foreach (var country in countries.OrderBy(c => c.name)) | |
{ | |
str += $"{countryCount++} -----".Substring(0, 5); | |
str += $" {country.name} ({country.regions.Count()}-{country.regions.Sum(r => r.cities.Count())}-{country.regions.Sum(r => r.cities.Sum(c => c.ips.Count()))}-{country.regions.Sum(r => r.cities.Sum(c => c.ips.Sum(i => i.requests.Count())))}-{country.regions.Sum(r => r.cities.Sum(c => c.ips.Sum(i => i.requests.Sum(re => re.count))))})\n"; | |
int regionCount = 1; | |
foreach (var region in country.regions.OrderBy(c => c.name)) | |
{ | |
str += $" {regionCount++} ----".Substring(0, 10); | |
str += $" {region.name} ({region.cities.Count()}-{region.cities.Sum(c => c.ips.Count())}-{region.cities.Sum(c => c.ips.Sum(i => i.requests.Count()))}-{region.cities.Sum(c => c.ips.Sum(i => i.requests.Sum(r => r.count)))})\n"; | |
int cityCount = 1; | |
foreach (var city in region.cities.OrderBy(c => c.name)) | |
{ | |
str += $" {cityCount++} -----".Substring(0, 15); | |
str += $" {city.name} ({city.ips.Count()}-{city.ips.Sum(i => i.requests.Count)}-{city.ips.Sum(i => i.requests.Sum(r => r.count))})\n"; | |
int ipCount = 1; | |
foreach (var ip in city.ips.OrderBy(c => c.name)) | |
{ | |
str += $" {ipCount++} -----".Substring(0, 20); | |
str += $" {ip.name} ({ip.requests.Count()}-{ip.requests.Sum(r => r.count)})\n"; | |
} | |
} | |
} | |
} | |
return str; | |
} | |
public void AddLocation(string country, string region, string city, string ip, string request) | |
{ | |
if(!countries.Any(c => c.name == country)) //If the country does not exist | |
{ | |
countries.Add(new CountryNode(country, region, city, ip, request)); | |
} | |
else | |
{ | |
//If the country exists but the region does not | |
if (!countries.Find(c => c.name == country).regions.Any(r => r.name == region)) | |
{ | |
countries.Find(c => c.name == country).regions.Add(new RegionNode(region, city, ip, request)); | |
} | |
else | |
{ | |
//If the country and region exists but the city does not | |
if (!countries.Find(c => c.name == country).regions.Find(r => r.name == region).cities.Any(c => c.name == city)) | |
{ | |
countries.Find(c => c.name == country).regions.Find(r => r.name == region).cities.Add(new CityNode(city, ip, request)); | |
} | |
else | |
{ | |
//If the country region and city exist but the IP doesn't | |
if(!countries.Find(c => c.name == country).regions.Find(r => r.name == region).cities.Find(c => c.name == city).ips.Any(i => i.name == ip)) | |
{ | |
countries.Find(c => c.name == country).regions.Find(r => r.name == region).cities.Find(c => c.name == city).ips.Add(new IpNode(ip, request)); | |
} | |
else | |
{ | |
// If the country region city and ip exist but the request doesn't | |
if(!countries.Find(c => c.name == country).regions.Find(r => r.name == region).cities.Find(c => c.name == city).ips.Find(i => i.name == ip).requests.Any(r => r.name == request)) | |
{ | |
countries.Find(c => c.name == country).regions.Find(r => r.name == region).cities.Find(c => c.name == city).ips.Find(i => i.name == ip).requests.Add(new RequestNode(request)); | |
} | |
//Everything exists, just increment by one | |
else | |
{ | |
countries.Find(c => c.name == country).regions.Find(r => r.name == region).cities.Find(c => c.name == city).ips.Find(i => i.name == ip).requests.First(r => r.name == request).count++; | |
} | |
} | |
} | |
} | |
} | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment