Add yang-xpath-impl
[yangtools.git] / yang / yang-xpath-impl / src / main / java / org / opendaylight / yangtools / yang / xpath / impl / BigDecimalXPathParser.java
1 /*
2  * Copyright (c) 2018 Pantheon Technologies, s.r.o.  All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8 package org.opendaylight.yangtools.yang.xpath.impl;
9
10 import java.math.BigDecimal;
11 import java.util.Optional;
12 import java.util.function.Function;
13 import org.opendaylight.yangtools.yang.common.QNameModule;
14 import org.opendaylight.yangtools.yang.xpath.api.YangBinaryOperator;
15 import org.opendaylight.yangtools.yang.xpath.api.YangBooleanConstantExpr;
16 import org.opendaylight.yangtools.yang.xpath.api.YangExpr;
17 import org.opendaylight.yangtools.yang.xpath.api.YangNumberExpr.YangBigDecimal;
18
19 final class BigDecimalXPathParser extends XPathParser<YangBigDecimal> {
20     private static final YangBigDecimal ZERO = YangBigDecimal.of(BigDecimal.ZERO);
21     private static final YangBigDecimal ONE = YangBigDecimal.of(BigDecimal.ONE);
22     private static final YangBigDecimal TEN = YangBigDecimal.of(BigDecimal.TEN);
23
24     BigDecimalXPathParser(final QNameModule implicitNamespace, final Function<String, QNameModule> prefixes) {
25         super(implicitNamespace, prefixes);
26     }
27
28     @Override
29     YangBigDecimal createNumber(final String str) {
30         switch (str) {
31             case "0":
32                 return ZERO;
33             case "1":
34                 return ONE;
35             case "10":
36                 return TEN;
37             default:
38                 return YangBigDecimal.of(new BigDecimal(str));
39         }
40     }
41
42     @Override
43     YangBigDecimal negateNumber(final YangBigDecimal number) {
44         return YangBigDecimal.of(number.getNumber().negate());
45     }
46
47     @Override
48     Optional<YangExpr> simplifyNumbers(final YangBinaryOperator operator, final YangBigDecimal left,
49             final YangBigDecimal right) {
50         final BigDecimal l = left.getNumber();
51         final BigDecimal r = right.getNumber();
52
53         final BigDecimal result;
54         switch (operator) {
55             case DIV:
56                 result = l.divide(r);
57                 break;
58             case EQUALS:
59                 return of(l.equals(r));
60             case GT:
61                 return of(l.compareTo(r) > 0);
62             case GTE:
63                 return of(l.compareTo(r) >= 0);
64             case LT:
65                 return of(l.compareTo(r) < 0);
66             case LTE:
67                 return of(l.compareTo(r) <= 0);
68             case MINUS:
69                 result = l.subtract(r);
70                 break;
71             case MOD:
72                 result = l.remainder(r);
73                 break;
74             case MUL:
75                 result = l.multiply(r);
76                 break;
77             case NOT_EQUALS:
78                 return of(!l.equals(r));
79             case PLUS:
80                 result = l.add(r);
81                 break;
82             default:
83                 throw new IllegalStateException("Unhandled operator " + operator);
84         }
85
86         return Optional.of(YangBigDecimal.of(result));
87     }
88
89     private static Optional<YangExpr> of(final boolean value) {
90         return Optional.of(YangBooleanConstantExpr.of(value));
91     }
92 }