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") @Column(name = "delta_xml_url")
protected String fiasDeltaXmlUrl; protected String fiasDeltaXmlUrl;
@Column(name = "regions")
protected String regions;
public Long getVersionId() { public Long getVersionId() {
return versionId; return versionId;
} }
@ -47,4 +50,25 @@ public class FiasVersion {
public String getFiasDeltaXmlUrl() { public String getFiasDeltaXmlUrl() {
return fiasDeltaXmlUrl; 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.exceptions.UnzipException;
import me.bearns.fias.repository.FiasVersionRepository; import me.bearns.fias.repository.FiasVersionRepository;
import me.bearns.fias.util.Catalog; import me.bearns.fias.util.Catalog;
import me.bearns.fias.util.RegionFilter;
import me.bearns.fias.util.UnmarshallerParameters; import me.bearns.fias.util.UnmarshallerParameters;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@ -14,6 +15,7 @@ import java.io.*;
import java.util.*; import java.util.*;
import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future; import java.util.concurrent.Future;
import java.util.function.Predicate;
import java.util.zip.ZipEntry; import java.util.zip.ZipEntry;
import java.util.zip.ZipException; import java.util.zip.ZipException;
import java.util.zip.ZipFile; import java.util.zip.ZipFile;
@ -45,6 +47,7 @@ public class FiasUpdater implements Updater {
if(dbVersionObj != null) { if(dbVersionObj != null) {
final Long dbVersion = dbVersionObj.getVersionId(); final Long dbVersion = dbVersionObj.getVersionId();
final String regions = dbVersionObj.getRegions();
final long lastOnlineVersion = clientStub.getLastVersionId(); final long lastOnlineVersion = clientStub.getLastVersionId();
@ -53,6 +56,9 @@ public class FiasUpdater implements Updater {
final List<FiasVersion> updates = clientStub.getVersionsAfter(dbVersion); 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()) { if(updates != null && !updates.isEmpty()) {
processUpdates(updates, false); processUpdates(updates, false);
} }
@ -66,14 +72,19 @@ public class FiasUpdater implements Updater {
public void reload(Long... regions) throws CommonException { public void reload(Long... regions) throws CommonException {
final List<FiasVersion> lastVersion = clientStub.getLastVersion(); 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 //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) { if(reloadFlag) {
//todo reload flag impl //todo reload flag impl
@ -90,13 +101,20 @@ public class FiasUpdater implements Updater {
//strict order //strict order
for (FiasVersion item : updates) { 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; final File file;
try { try {
//wait for downloading //wait for downloading
file = map.get(item).get(); file = map.get(item).get();
//process update //process update
processArchive(file, regions); processArchive(file, filter);
//apply this version //apply this version
versions.save(item); 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)){ try(final ZipFile zipFile = new ZipFile(file)){
@ -126,7 +144,7 @@ public class FiasUpdater implements Updater {
if(config!=null) { //todo if(config!=null) { //todo
try (InputStream is = zipFile.getInputStream(entry)) { 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: - column:
name: delta_xml_url name: delta_xml_url
type: varchar type: varchar
- column:
name: regions
type: varchar
Loading…
Cancel
Save