diff --git a/backend/src/main/java/cx/flamingo/analysis/service/LanguageService.java b/backend/src/main/java/cx/flamingo/analysis/service/LanguageService.java index 594a906..f209bb6 100644 --- a/backend/src/main/java/cx/flamingo/analysis/service/LanguageService.java +++ b/backend/src/main/java/cx/flamingo/analysis/service/LanguageService.java @@ -5,6 +5,7 @@ import java.io.InputStreamReader; import java.util.ArrayList; import java.util.List; +import java.util.Optional; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -72,11 +73,10 @@ public List autocompleteLanguages(String query, int maxResults) { .collect(Collectors.toList()); } - public Language getLanguageById(String id) { + public Optional getLanguageById(String id) { return languages.stream() .filter(l -> l.getId().equals(id)) - .findFirst() - .orElse(null); + .findFirst(); } public List getAllLanguages() { @@ -89,4 +89,4 @@ public Language getDefaultLanguage() { .findFirst() .orElseThrow(() -> new RuntimeException("Default language (Java) not found")); } -} \ No newline at end of file +} diff --git a/backend/src/main/java/cx/flamingo/analysis/service/RegionService.java b/backend/src/main/java/cx/flamingo/analysis/service/RegionService.java index ff7deb6..24fdfbe 100644 --- a/backend/src/main/java/cx/flamingo/analysis/service/RegionService.java +++ b/backend/src/main/java/cx/flamingo/analysis/service/RegionService.java @@ -5,35 +5,39 @@ import java.io.InputStreamReader; import java.util.ArrayList; import java.util.Arrays; +import java.util.HashMap; import java.util.List; +import java.util.Map; +import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; import java.util.stream.Stream; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.io.ClassPathResource; import org.springframework.stereotype.Service; import cx.flamingo.analysis.model.City; import cx.flamingo.analysis.model.Region; import jakarta.annotation.PostConstruct; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @Slf4j @Service +@RequiredArgsConstructor public class RegionService { private List regions; + private Map regionPopulationCache; - @Autowired - private StateService stateService; + private final StateService stateService; - @Autowired - private CityService cityService; + private final CityService cityService; @PostConstruct public void init() { loadRegions(); log.info("Loaded {} regions", regions.size()); + buildPopulationCache(); } private void loadRegions() { @@ -71,6 +75,15 @@ private void loadRegions() { } } + private void buildPopulationCache() { + regionPopulationCache = new HashMap<>(); + for (City city : cityService.getAllCities()) { + for (String regionId : city.getRegionIds()) { + regionPopulationCache.merge(regionId, city.getPopulation(), Integer::sum); + } + } + } + public void updateRegion(Region updatedRegion) { int index = -1; for (int i = 0; i < regions.size(); i++) { @@ -88,10 +101,7 @@ public void updateRegion(Region updatedRegion) { } private int getRegionTotalPopulation(Region region) { - return cityService.getAllCities().stream() - .filter(city -> city.getRegionIds().contains(region.getId())) - .mapToInt(City::getPopulation) - .sum(); + return regionPopulationCache.getOrDefault(region.getId(), 0); } public List autocompleteRegions(String query, String stateId, List cityIds, int maxResults) { @@ -122,21 +132,19 @@ public List autocompleteRegions(String query, String stateId, List getRegionById(String id) { return regions.stream() .filter(r -> r.getId().equals(id)) - .findFirst() - .orElse(null); + .findFirst(); } - public Region getRegionByName(String name) { + public Optional getRegionByName(String name) { return regions.stream() .filter(r -> r.getName().equalsIgnoreCase(name)) - .findFirst() - .orElse(null); + .findFirst(); } public List getAllRegions() { return new ArrayList<>(regions); } -} \ No newline at end of file +} diff --git a/backend/src/main/java/cx/flamingo/analysis/service/StateService.java b/backend/src/main/java/cx/flamingo/analysis/service/StateService.java index 3eabd47..b881ba2 100644 --- a/backend/src/main/java/cx/flamingo/analysis/service/StateService.java +++ b/backend/src/main/java/cx/flamingo/analysis/service/StateService.java @@ -4,8 +4,11 @@ import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; +import java.util.HashMap; import java.util.HashSet; import java.util.List; +import java.util.Map; +import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -24,6 +27,7 @@ @Service public class StateService { private List states; + private Map statePopulationCache; private final CityService cityService; @@ -36,6 +40,7 @@ public StateService(@Lazy CityService cityService) { public void init() { loadStates(); log.info("Loaded {} states", states.size()); + buildPopulationCache(); } private void loadStates() { @@ -70,11 +75,15 @@ private void loadStates() { } } + private void buildPopulationCache() { + statePopulationCache = new HashMap<>(); + for (City city : cityService.getAllCities()) { + statePopulationCache.merge(city.getStateId(), city.getPopulation(), Integer::sum); + } + } + private int getStateTotalPopulation(State state) { - return cityService.getAllCities().stream() - .filter(city -> city.getStateId().equals(state.getId())) - .mapToInt(City::getPopulation) - .sum(); + return statePopulationCache.getOrDefault(state.getId(), 0); } public List autocompleteStates(String query, String regionId, List cityIds, int maxResults) { @@ -105,21 +114,19 @@ public List autocompleteStates(String query, String regionId, List getStateById(String id) { return states.stream() .filter(s -> s.getId().equals(id)) - .findFirst() - .orElse(null); + .findFirst(); } - public State getStateByCode(String code) { + public Optional getStateByCode(String code) { return states.stream() .filter(s -> s.getCode().equalsIgnoreCase(code)) - .findFirst() - .orElse(null); + .findFirst(); } public List getAllStates() { return new ArrayList<>(states); } -} \ No newline at end of file +}