Compare commits

...

2 Commits

Author SHA1 Message Date
Terekhin Alexander 7afbe9ef92 Filter by region for updates 5 years ago
Terekhin Alexander 1e40707633 Filter by region codes 5 years ago
  1. 24
      src/main/java/me/bearns/fias/domain/FiasVersion.java
  2. 30
      src/main/java/me/bearns/fias/service/FiasUpdater.java
  3. 35
      src/main/java/me/bearns/fias/util/RegionFilter.java
  4. 3
      src/main/resources/db/changelog/000_initial_schema.yaml

@ -32,6 +32,9 @@ public class FiasVersion {
@Column(name = "delta_xml_url")
protected String fiasDeltaXmlUrl;
@Column(name = "regions")
protected String regions;
public Long getVersionId() {
return versionId;
}
@ -47,4 +50,25 @@ public class FiasVersion {
public String getFiasDeltaXmlUrl() {
return fiasDeltaXmlUrl;
}
public String getRegions() {
return regions;
}
public void setRegions(Long ... regions) {
StringBuilder sb = new StringBuilder();
for(Long region : regions) {
if((region != null) && (region > 0) && (region < 100)){
if(sb.length() > 0) sb.append(",");
sb.append(String.format("%1$02d", region));
}
}
this.regions = sb.length() > 0 ? sb.toString() : null;
}
public void setRegions(String regions){
this.regions = regions;
}
}

@ -6,6 +6,7 @@ import me.bearns.fias.exceptions.DownloadException;
import me.bearns.fias.exceptions.UnzipException;
import me.bearns.fias.repository.FiasVersionRepository;
import me.bearns.fias.util.Catalog;
import me.bearns.fias.util.RegionFilter;
import me.bearns.fias.util.UnmarshallerParameters;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@ -14,6 +15,7 @@ import java.io.*;
import java.util.*;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import java.util.function.Predicate;
import java.util.zip.ZipEntry;
import java.util.zip.ZipException;
import java.util.zip.ZipFile;
@ -45,6 +47,7 @@ public class FiasUpdater implements Updater {
if(dbVersionObj != null) {
final Long dbVersion = dbVersionObj.getVersionId();
final String regions = dbVersionObj.getRegions();
final long lastOnlineVersion = clientStub.getLastVersionId();
@ -53,6 +56,9 @@ public class FiasUpdater implements Updater {
final List<FiasVersion> updates = clientStub.getVersionsAfter(dbVersion);
//set region filters for updates
if(regions != null) updates.forEach(u -> u.setRegions(regions));
if(updates != null && !updates.isEmpty()) {
processUpdates(updates, false);
}
@ -66,14 +72,19 @@ public class FiasUpdater implements Updater {
public void reload(Long... regions) throws CommonException {
final List<FiasVersion> lastVersion = clientStub.getLastVersion();
if(lastVersion != null) {
processUpdates(lastVersion, true, regions);
//exist and only one
if(lastVersion != null && lastVersion.size() == 1) {
//set region filter
lastVersion.get(0).setRegions(regions);
processUpdates(lastVersion, true);
}
}
//transaction from here
private void processUpdates(List<FiasVersion> updates, boolean reloadFlag, Long ... regions) throws CommonException {
private void processUpdates(List<FiasVersion> updates, boolean reloadFlag) throws CommonException {
if(reloadFlag) {
//todo reload flag impl
@ -90,13 +101,20 @@ public class FiasUpdater implements Updater {
//strict order
for (FiasVersion item : updates) {
//set region filter
final String regions = item.getRegions();
RegionFilter filter = null;
if(regions != null) {
filter = new RegionFilter(regions);
}
final File file;
try {
//wait for downloading
file = map.get(item).get();
//process update
processArchive(file, regions);
processArchive(file, filter);
//apply this version
versions.save(item);
@ -112,7 +130,7 @@ public class FiasUpdater implements Updater {
}
}
private void processArchive(File file, Long ... regions) throws CommonException {
private void processArchive(File file, Predicate filter) throws CommonException {
try(final ZipFile zipFile = new ZipFile(file)){
@ -126,7 +144,7 @@ public class FiasUpdater implements Updater {
if(config!=null) { //todo
try (InputStream is = zipFile.getInputStream(entry)) {
unmarshaller.process(is, config, null);
unmarshaller.process(is, config, filter);
}
}
}

@ -0,0 +1,35 @@
package me.bearns.fias.util;
import me.bearns.fias.domain.Addrobj;
import me.bearns.fias.domain.House;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Objects;
import java.util.Set;
import java.util.function.Predicate;
public class RegionFilter implements Predicate {
private final Set<String> set = new HashSet<>();
public RegionFilter(String codes) {
if(codes!=null){
Arrays.stream(codes.split(",")).filter(Objects::nonNull).filter(s -> s.matches("^\\d{2}$")).forEach(set::add);
}
}
@Override
public boolean test(Object o) {
String regioncode = null;
if(o instanceof Addrobj){
regioncode = ((Addrobj) o).regioncode;
} else if(o instanceof House){
regioncode = ((House) o).regioncode;
}
return regioncode != null && set.contains(regioncode);
}
}

@ -21,3 +21,6 @@ databaseChangeLog:
- column:
name: delta_xml_url
type: varchar
- column:
name: regions
type: varchar
Loading…
Cancel
Save