Added support of 'Mo-Su 07:00-23:00, Fr 08:00-20:00' to opening hours parser

This commit is contained in:
Alexey Kulish 2018-01-22 18:32:32 +03:00
parent 7dc6d1f42c
commit 7d880b7ef5

View file

@ -120,6 +120,15 @@ public class OpeningHoursParser {
rules.add(r); rules.add(r);
} }
/**
* add rules to the opening hours
*
* @param rules to add
*/
public void addRules(List<OpeningHoursRule> rules) {
this.rules.addAll(rules);
}
/** /**
* return the list of rules * return the list of rules
* *
@ -1176,7 +1185,7 @@ public class OpeningHoursParser {
} }
} }
public static OpeningHoursParser.OpeningHoursRule parseRuleV2(String r) { public static void parseRuleV2(String r, List<OpeningHoursParser.OpeningHoursRule> rules) {
r = r.toLowerCase(); r = r.toLowerCase();
final String[] daysStr = new String[]{"mo", "tu", "we", "th", "fr", "sa", "su"}; final String[] daysStr = new String[]{"mo", "tu", "we", "th", "fr", "sa", "su"};
@ -1197,7 +1206,8 @@ public class OpeningHoursParser {
Arrays.fill(days, true); Arrays.fill(days, true);
Arrays.fill(months, true); Arrays.fill(months, true);
basic.addTimeRange(0, 24 * 60); basic.addTimeRange(0, 24 * 60);
return basic; rules.add(basic);
return;
} }
List<Token> tokens = new ArrayList<>(); List<Token> tokens = new ArrayList<>();
int startWord = 0; int startWord = 0;
@ -1280,6 +1290,10 @@ public class OpeningHoursParser {
} }
} }
} }
buildRule(basic, tokens, rules);
}
private static void buildRule(BasicOpeningHourRule basic, List<Token> tokens, List<OpeningHoursRule> rules) {
// order MONTH MONTH_DAY DAY_WEEK HOUR_MINUTE OPEN_OFF // order MONTH MONTH_DAY DAY_WEEK HOUR_MINUTE OPEN_OFF
TokenType currentParse = TokenType.TOKEN_UNKNOWN; TokenType currentParse = TokenType.TOKEN_UNKNOWN;
List<Token[]> listOfPairs = new ArrayList<>(); List<Token[]> listOfPairs = new ArrayList<>();
@ -1313,28 +1327,28 @@ public class OpeningHoursParser {
} }
} }
} else if (pair[0] != null) { } else if (pair[0] != null) {
if(pair[0].type == TokenType.TOKEN_HOLIDAY) { if (pair[0].type == TokenType.TOKEN_HOLIDAY) {
if(pair[0].mainNumber == 0) { if (pair[0].mainNumber == 0) {
basic.publicHoliday = true; basic.publicHoliday = true;
} else if(pair[0].mainNumber == 1) { } else if (pair[0].mainNumber == 1) {
basic.schoolHoliday = true; basic.schoolHoliday = true;
} else if(pair[0].mainNumber == 2) { } else if (pair[0].mainNumber == 2) {
basic.easter = true; basic.easter = true;
} }
} else if(pair[0].mainNumber >= 0){ } else if (pair[0].mainNumber >= 0) {
array[pair[0].mainNumber] = true; array[pair[0].mainNumber] = true;
} }
} }
} }
} else if (currentParse == TokenType.TOKEN_HOUR_MINUTES) { } else if (currentParse == TokenType.TOKEN_HOUR_MINUTES) {
for (Token[] pair : listOfPairs) { for (Token[] pair : listOfPairs) {
if(pair[0] != null && pair[1] != null) { if (pair[0] != null && pair[1] != null) {
basic.addTimeRange(pair[0].mainNumber, pair[1].mainNumber); basic.addTimeRange(pair[0].mainNumber, pair[1].mainNumber);
} }
} }
} else if (currentParse == TokenType.TOKEN_OFF_ON) { } else if (currentParse == TokenType.TOKEN_OFF_ON) {
Token[] l = listOfPairs.get(0); Token[] l = listOfPairs.get(0);
if(l[0] != null && l[0].mainNumber == 0) { if (l[0] != null && l[0].mainNumber == 0) {
basic.off = true; basic.off = true;
} }
} }
@ -1343,16 +1357,23 @@ public class OpeningHoursParser {
indexP = 0; indexP = 0;
listOfPairs.add(currentPair); listOfPairs.add(currentPair);
currentPair[indexP++] = t; currentPair[indexP++] = t;
if(t != null) { if (t != null) {
currentParse = t.type; currentParse = t.type;
} }
} else if(t.type == TokenType.TOKEN_COMMA) { } else if (t.type.ord() < currentParse.ord() && indexP == 0) {
buildRule(new BasicOpeningHourRule(), tokens.subList(i, tokens.size()), rules);
tokens = tokens.subList(0, i + 1);
} else if (t.type == TokenType.TOKEN_COMMA) {
if (tokens.size() > i + 1 && tokens.get(i + 1) != null && tokens.get(i + 1).type.ord() < currentParse.ord()) {
indexP = 0;
} else {
currentPair = new Token[2]; currentPair = new Token[2];
indexP = 0; indexP = 0;
listOfPairs.add(currentPair); listOfPairs.add(currentPair);
} else if(t.type == TokenType.TOKEN_DASH) { }
} else if (t.type == TokenType.TOKEN_DASH) {
} else if(t.type.ord() == currentParse.ord()) { } else if (t.type.ord() == currentParse.ord()) {
if(indexP < 2) { if(indexP < 2) {
currentPair[indexP++] = t; currentPair[indexP++] = t;
} }
@ -1372,7 +1393,7 @@ public class OpeningHoursParser {
// basic.addTimeRange(0, 24 * 60); // basic.addTimeRange(0, 24 * 60);
// } // }
// System.out.println(r + " " + tokens); // System.out.println(r + " " + tokens);
return basic; rules.add(0, basic);
} }
private static void findInArray(Token t, String[] list, TokenType tokenType) { private static void findInArray(Token t, String[] list, TokenType tokenType) {
@ -1391,8 +1412,8 @@ public class OpeningHoursParser {
* @param r the string to parse * @param r the string to parse
* @return BasicRule if the String is successfully parsed and UnparseableRule otherwise * @return BasicRule if the String is successfully parsed and UnparseableRule otherwise
*/ */
public static OpeningHoursParser.OpeningHoursRule parseRule(String r) { public static void parseRules(String r, List<OpeningHoursParser.OpeningHoursRule> rules) {
return parseRuleV2(r); parseRuleV2(r, rules);
} }
/** /**
@ -1416,10 +1437,12 @@ public class OpeningHoursParser {
continue; continue;
} }
// check if valid // check if valid
final OpeningHoursRule r1 = parseRule(r); List<OpeningHoursParser.OpeningHoursRule> rList = new ArrayList<>();
boolean rule = r1 instanceof BasicOpeningHourRule; parseRules(r, rList);
if (rule) { for (OpeningHoursParser.OpeningHoursRule rule : rList) {
rs.addRule(r1); if (rule instanceof BasicOpeningHourRule) {
rs.addRule(rule);
}
} }
} }
return rs; return rs;
@ -1446,7 +1469,9 @@ public class OpeningHoursParser {
continue; continue;
} }
// check if valid // check if valid
rs.addRule(OpeningHoursParser.parseRule(r)); List<OpeningHoursParser.OpeningHoursRule> rList = new ArrayList<>();
parseRules(r, rList);
rs.addRules(rList);
} }
return rs; return rs;
} }
@ -1797,5 +1822,15 @@ public class OpeningHoursParser {
hours = parseOpenedHours("24/7"); hours = parseOpenedHours("24/7");
System.out.println(hours); System.out.println(hours);
testInfo("24.01.2018 02:00", hours, "Open 24/7"); testInfo("24.01.2018 02:00", hours, "Open 24/7");
hours = parseOpenedHours("Mo-Su 07:00-23:00, Fr 08:00-20:00");
System.out.println(hours);
testOpened("15.01.2018 06:45", hours, false);
testOpened("15.01.2018 07:45", hours, true);
testOpened("15.01.2018 23:45", hours, false);
testOpened("19.01.2018 07:45", hours, false);
testOpened("19.01.2018 08:45", hours, true);
testOpened("19.01.2018 20:45", hours, false);
} }
} }