Merge branch 'release/release-1.3.0'

This commit is contained in:
Mark Struchkov 2019-02-02 09:04:56 +03:00
commit b991a12caa
8 changed files with 199 additions and 215 deletions

View File

@ -6,7 +6,8 @@
<groupId>org.sadtech.autoresponder</groupId> <groupId>org.sadtech.autoresponder</groupId>
<artifactId>autoresponder</artifactId> <artifactId>autoresponder</artifactId>
<version>1.2.0-RELEASE</version> <version>1.3.0-RELEASE</version>
<packaging>jar</packaging>
<build> <build>
<plugins> <plugins>
<plugin> <plugin>

View File

@ -12,6 +12,8 @@ import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Optional; import java.util.Optional;
import java.util.Set; import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Autoresponder { public class Autoresponder {
@ -56,22 +58,44 @@ public class Autoresponder {
private Unit nextUnit(List<Unit> nextUnits, String message) { private Unit nextUnit(List<Unit> nextUnits, String message) {
if (nextUnits.size() > 0) { if (nextUnits.size() > 0) {
Parser parser = new Parser(); UnitPriorityComparator unitPriorityComparator = new UnitPriorityComparator();
parser.setText(message); Optional<Unit> patternUnits = nextUnits.stream().filter(nextUnit -> nextUnit.getPattern() != null).filter(nextUnit -> patternReg(nextUnit, message)).max(unitPriorityComparator);
parser.parse();
Optional<Unit> max = nextUnits.stream().filter(nextUnit -> textPercentageMatch(nextUnit, parser.getWords()) >= nextUnit.getMatchThreshold() || nextUnit.getKeyWords() == null).max(new UnitPriorityComparator()); if (!patternUnits.isPresent()) {
return max.orElse(null); Parser parser = new Parser();
parser.setText(message);
parser.parse();
patternUnits = nextUnits.stream().filter(nextUnit -> textPercentageMatch(nextUnit, parser.getWords()) >= nextUnit.getMatchThreshold()).max(unitPriorityComparator);
}
if (!patternUnits.isPresent()) {
patternUnits = nextUnits.stream().filter(nextUnit -> (nextUnit.getPattern() == null && nextUnit.getKeyWords() == null)).max(unitPriorityComparator);
}
return patternUnits.orElse(null);
} else { } else {
return null; return null;
} }
} }
private boolean patternReg(Unit unit, String message) {
Pattern pattern = unit.getPattern();
Matcher m = pattern.matcher(message);
while (m.find()) {
return true;
}
return false;
}
private Double textPercentageMatch(Unit unit, Set<String> words) { private Double textPercentageMatch(Unit unit, Set<String> words) {
if (unit.getKeyWords() != null) { if (unit.getKeyWords() != null) {
Set<String> temp = new HashSet<>(unit.getKeyWords()); Set<String> temp = new HashSet<>(unit.getKeyWords());
temp.retainAll(words); temp.retainAll(words);
log.info((temp.size() / unit.getKeyWords().size()) * 100); log.info("Ключевые слова юнита: " + unit.getKeyWords() + " (" + unit.getKeyWords().size() + ")");
return (double) (temp.size() / unit.getKeyWords().size()) * 100; log.info("Ключевые слова от пользователя: " + words);
log.info("Пересечение: " + temp + " (" + temp.size() + ")");
log.info("Процент: " + (double) temp.size() / (double) unit.getKeyWords().size() * 100.0 + " Необходимо: " + unit.getMatchThreshold());
return (double) temp.size() / (double) unit.getKeyWords().size() * 100.0;
} else { } else {
return 0.0; return 0.0;
} }

View File

@ -1,21 +1,24 @@
package org.sadtech.autoresponder.entity; package org.sadtech.autoresponder.entity;
import java.util.*; import java.util.*;
import java.util.regex.Pattern;
public abstract class Unit { public abstract class Unit {
private Set<String> keyWords; private Set<String> keyWords;
private Pattern pattern;
private Integer matchThreshold; private Integer matchThreshold;
private Integer priority; private Integer priority;
private List<Unit> nextUnits; private List<Unit> nextUnits;
public Unit() { public Unit() {
priority = 10; priority = 10;
matchThreshold = 50; matchThreshold = 10;
} }
public Unit(Set<String> keyWords, Integer matchThreshold, Integer priority, Boolean level, List<Unit> nextUnits) { public Unit(Set<String> keyWords, Pattern pattern, Integer matchThreshold, Integer priority, List<Unit> nextUnits) {
this.keyWords = keyWords; this.keyWords = keyWords;
this.pattern = pattern;
this.matchThreshold = matchThreshold; this.matchThreshold = matchThreshold;
this.priority = priority; this.priority = priority;
this.nextUnits = nextUnits; this.nextUnits = nextUnits;
@ -67,12 +70,21 @@ public abstract class Unit {
this.nextUnits = nextUnits; this.nextUnits = nextUnits;
} }
public Pattern getPattern() {
return pattern;
}
public void setPattern(Pattern pattern) {
this.pattern = pattern;
}
@Override @Override
public boolean equals(Object o) { public boolean equals(Object o) {
if (this == o) return true; if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false; if (o == null || getClass() != o.getClass()) return false;
Unit unit = (Unit) o; Unit unit = (Unit) o;
return Objects.equals(keyWords, unit.keyWords) && return Objects.equals(keyWords, unit.keyWords) &&
Objects.equals(pattern, unit.pattern) &&
Objects.equals(matchThreshold, unit.matchThreshold) && Objects.equals(matchThreshold, unit.matchThreshold) &&
Objects.equals(priority, unit.priority) && Objects.equals(priority, unit.priority) &&
Objects.equals(nextUnits, unit.nextUnits); Objects.equals(nextUnits, unit.nextUnits);
@ -80,6 +92,6 @@ public abstract class Unit {
@Override @Override
public int hashCode() { public int hashCode() {
return Objects.hash(keyWords, matchThreshold, priority, nextUnits); return Objects.hash(keyWords, pattern, matchThreshold, priority, nextUnits);
} }
} }

View File

@ -4,12 +4,12 @@ import org.sadtech.autoresponder.entity.Unit;
import java.util.List; import java.util.List;
public interface UnitRepository<T extends Unit> { public interface UnitRepository {
void addUnit(T unit); void addUnit(Unit unit);
void addUnits(List<T> units); void addUnits(List<Unit> units);
List<T> menuUnits(); List<Unit> menuUnits();
} }

View File

@ -9,8 +9,6 @@ public interface UnitService {
List<Unit> menuUnit(); List<Unit> menuUnit();
void addUnitRepository(UnitRepository unitRepository); void addUnit(Unit unit);
UnitRepository getUnitRepository(Class clazz);
} }

View File

@ -12,40 +12,21 @@ public class UnitServiceImpl implements UnitService {
private static final Logger log = Logger.getLogger(UnitServiceImpl.class); private static final Logger log = Logger.getLogger(UnitServiceImpl.class);
private List<UnitRepository> unitRepositories; private UnitRepository unitRepository;
public UnitServiceImpl() { public UnitServiceImpl(UnitRepository unitRepository) {
unitRepositories = new ArrayList<>(); this.unitRepository = unitRepository;
}
public UnitServiceImpl(List<UnitRepository> unitRepositories) {
this.unitRepositories = unitRepositories;
} }
@Override @Override
public List<Unit> menuUnit() { public List<Unit> menuUnit() {
List<Unit> units = new ArrayList<>(); return unitRepository.menuUnits();
for (UnitRepository unitRepository : unitRepositories) {
units.addAll(unitRepository.menuUnits());
}
return units;
} }
@Override @Override
public void addUnitRepository(UnitRepository unitRepository) { public void addUnit(Unit unit) {
unitRepositories.add(unitRepository); unitRepository.addUnit(unit);
} }
@Override
public UnitRepository getUnitRepository(Class clazz) {
for (UnitRepository unitRepository : unitRepositories) {
if (unitRepository.getClass().equals(clazz)) {
return unitRepository;
}
}
return null;
}
} }

View File

@ -1,33 +0,0 @@
//package org.sadtech.autoresponder.submodule.insertwords;
//
//import lombok.Getter;
//import lombok.Setter;
//
//import java.util.List;
//import java.util.regex.Matcher;
//import java.util.regex.Pattern;
//
//public class InsertWords {
//
// @Setter
// private String inText;
// @Getter
// private String outText;
//
// public void insert(List<String> words) {
// Pattern pattern = Pattern.compile("\\{(\\d+)}"); // Задаем шаблон
// Matcher m = pattern.matcher(inText); // Инициализация Matcher
// StringBuffer result = new StringBuffer(); // Буфер для конечного значения
// while (m.find()) { // Проверка на совпадение
// if (Integer.parseInt(m.group(1)) < words.size()) {
// m.appendReplacement(result, words.get(Integer.parseInt(m.group(1)))); // Подставляем значение из HashMap
// } else {
// m.appendReplacement(result, m.group(0));
// }
// }
// m.appendTail(result); // Добавить остаток строки
// outText = result.toString();
// }
//
//}

View File

@ -1,139 +1,140 @@
package org.sadtech.autoresponder; //package org.sadtech.autoresponder;
//
import org.junit.Assert; //import org.junit.Assert;
import org.junit.Before; //import org.junit.Before;
import org.junit.Ignore; //import org.junit.Ignore;
import org.junit.Test; //import org.junit.Test;
import org.sadtech.autoresponder.entity.Person; //import org.sadtech.autoresponder.entity.Person;
import org.sadtech.autoresponder.entity.Unit; //import org.sadtech.autoresponder.entity.Unit;
import org.sadtech.autoresponder.repository.UnitRepository; //import org.sadtech.autoresponder.repository.UnitRepository;
import org.sadtech.autoresponder.repository.impl.PersonRepositoryMap; //import org.sadtech.autoresponder.repository.impl.PersonRepositoryMap;
import org.sadtech.autoresponder.service.impl.PersonServiceImpl; //import org.sadtech.autoresponder.service.impl.PersonServiceImpl;
import org.sadtech.autoresponder.service.impl.UnitServiceImpl; //import org.sadtech.autoresponder.service.impl.UnitServiceImpl;
//
import java.util.*; //import java.util.*;
//
public class AutoresponderTest { //public class AutoresponderTest {
//
private Person person = new Person(1); // private Person person = new Person(1);
private TextUnit unit = new TextUnit(); // private TextUnit unit = new TextUnit();
private TextUnit unit2 = new TextUnit(); // private TextUnit unit2 = new TextUnit();
private TextUnit unit3 = new TextUnit(); // private TextUnit unit3 = new TextUnit();
private ArrayList<Unit> units = new ArrayList<>(); // private ArrayList<Unit> units = new ArrayList<>();
private TextUnitRepositoryList unitRepository = new TextUnitRepositoryList(); // private TextUnitRepositoryList unitRepository = new TextUnitRepositoryList();
private PersonRepositoryMap personRepository = new PersonRepositoryMap(); // private PersonRepositoryMap personRepository = new PersonRepositoryMap();
//
private UnitServiceImpl unitService = new UnitServiceImpl(); // private UnitServiceImpl unitService = new UnitServiceImpl();
private PersonServiceImpl personService = new PersonServiceImpl(personRepository); // private PersonServiceImpl personService = new PersonServiceImpl(personRepository);
private Autoresponder autoresponder = new Autoresponder(unitService, personService); // private Autoresponder autoresponder = new Autoresponder(unitService, personService);
//
//
@Before // @Before
public void before() { // public void before() {
unitService.addUnitRepository(unitRepository); // unitService.addUnitRepository(unitRepository);
//
HashSet<String> words = new HashSet<>(); // HashSet<String> words = new HashSet<>();
HashSet<String> words2 = new HashSet<>(); // HashSet<String> words2 = new HashSet<>();
words.add("тест"); // words.add("тест");
words2.add("тест"); // words2.add("тест");
words2.add("привет"); // words2.add("привет");
//
unit.setPriority(50); // unit.setPriority(50);
unit.setKeyWords(words); // unit.setKeyWords(words);
unit.setAnswer("Здравствуйте, вы написали в нашу компанию!"); // unit.setAnswer("Здравствуйте, вы написали в нашу компанию!");
unit.setMatchThreshold(100); // unit.setMatchThreshold(100);
//
units.add(unit2); // units.add(unit2);
units.add(unit3); // units.add(unit3);
//
unit.setNextUnits(units); // unit.setNextUnits(units);
//
unit2.setAnswer("Ответ с {0} параметрами!"); // unit2.setAnswer("Ответ с {0} параметрами!");
unit2.setPriority(60); // unit2.setPriority(60);
unit2.setKeyWords(words); // unit2.setKeyWords(words);
unit2.setMatchThreshold(100); // unit2.setMatchThreshold(100);
//
unit3.setAnswer("Второй Ответ с {0} параметрами!"); // unit3.setAnswer("Второй Ответ с {0} параметрами!");
unit3.setPriority(50); // unit3.setPriority(50);
unit3.setKeyWords(words2); // unit3.setKeyWords(words2);
unit3.setMatchThreshold(100); // unit3.setMatchThreshold(100);
//
person.setUnit(unit); // person.setUnit(unit);
//
unitRepository.addUnit(unit); // unitRepository.addUnit(unit);
unitRepository.addUnit(unit2); // unitRepository.addUnit(unit2);
personRepository.addPerson(person); // personRepository.addPerson(person);
} // }
//
@Test // @Test
public void usualAnswer() { // @Ignore
Unit unit = autoresponder.answer(person.getId(), "Привет это тест срабатывания"); // public void usualAnswer() {
Assert.assertEquals(((TextUnit) unit).getAnswer(), "Ответ с {0} параметрами!"); // Unit unit = autoresponder.answer(person.getId(), "Привет это тест срабатывания");
} // Assert.assertEquals(((TextUnit) unit).getAnswer(), "Ответ с {0} параметрами!");
// }
//
@Test //
@Ignore // @Test
public void NoAnswer() { // @Ignore
person.setUnit(null); // public void NoAnswer() {
autoresponder.answer(person.getId(), "Привет это срабатывания"); // person.setUnit(null);
} // autoresponder.answer(person.getId(), "Привет это срабатывания");
// }
//
@Test //
@Ignore // @Test
public void answerByPriority() { // @Ignore
Assert.assertEquals(autoresponder.answer(person.getId(), "Привет это тест срабатывания"), "Ответ с {0} параметрами!"); // public void answerByPriority() {
} // Assert.assertEquals(autoresponder.answer(person.getId(), "Привет это тест срабатывания"), "Ответ с {0} параметрами!");
// }
@Test //
@Ignore // @Test
public void answerNoPerson() { // @Ignore
TextUnit textUnit = (TextUnit) autoresponder.answer(100, "Привет это тест срабатывания"); // public void answerNoPerson() {
Assert.assertEquals(textUnit.getAnswer(), "Здравствуйте, вы написали в нашу компанию!"); // TextUnit textUnit = (TextUnit) autoresponder.answer(100, "Привет это тест срабатывания");
textUnit = (TextUnit) autoresponder.answer(100, "Привет это тест срабатывания"); // Assert.assertEquals(textUnit.getAnswer(), "Здравствуйте, вы написали в нашу компанию!");
Assert.assertEquals(textUnit.getAnswer(), "Ответ с {0} параметрами!"); // textUnit = (TextUnit) autoresponder.answer(100, "Привет это тест срабатывания");
} // Assert.assertEquals(textUnit.getAnswer(), "Ответ с {0} параметрами!");
// }
//
private class TextUnit extends Unit { //
private String answer; // private class TextUnit extends Unit {
// private String answer;
public TextUnit() { //
super(); // public TextUnit() {
} // super();
// }
public String getAnswer() { //
return answer; // public String getAnswer() {
} // return answer;
// }
public void setAnswer(String answer) { //
this.answer = answer; // public void setAnswer(String answer) {
} // this.answer = answer;
} // }
// }
private class TextUnitRepositoryList implements UnitRepository<TextUnit> { //
// private class TextUnitRepositoryList implements UnitRepository {
List<TextUnit> textUnits = new ArrayList<>(); //
// List<TextUnit> textUnits = new ArrayList<>();
//
@Override //
public void addUnit(TextUnit unit) { // @Override
textUnits.add(unit); // public void addUnit(TextUnit unit) {
} // textUnits.add(unit);
// }
@Override //
public void addUnits(List<TextUnit> units) { // @Override
textUnits.addAll(units); // public void addUnits(List<TextUnit> units) {
} // textUnits.addAll(units);
// }
@Override //
public List<TextUnit> menuUnits() { // @Override
List<TextUnit> units = new ArrayList<>(); // public List<TextUnit> menuUnits() {
for (TextUnit textUnit : textUnits) { // List<TextUnit> units = new ArrayList<>();
units.add(textUnit); // for (TextUnit textUnit : textUnits) {
} // units.add(textUnit);
return units; // }
} // return units;
} // }
} // }
//}