Skip to content

Instantly share code, notes, and snippets.

@galenguyer
Last active October 18, 2018 00:10
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save galenguyer/5e846da53983fb10e820c502f1eb780e to your computer and use it in GitHub Desktop.
Save galenguyer/5e846da53983fb10e820c502f1eb780e to your computer and use it in GitHub Desktop.
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