1 /**
2  * UGENE - Integrated Bioinformatics Tools.
3  * Copyright (C) 2008-2021 UniPro <ugene@unipro.ru>
4  * http://ugene.net
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2
9  * of the License, or (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19  * MA 02110-1301, USA.
20  */
21 
22 #include "MarkerUtils.h"
23 
24 #include <QVariant>
25 
26 namespace U2 {
27 
28 const QString MarkerUtils::INTERVAL_OPERATION("..");
29 const QString MarkerUtils::LESS_OPERATION("<=");
30 const QString MarkerUtils::GREATER_OPERATION(">=");
31 const QString MarkerUtils::REST_OPERATION("rest");
32 const QString MarkerUtils::STARTS_OPERATION("starts");
33 const QString MarkerUtils::ENDS_OPERATION("ends");
34 const QString MarkerUtils::CONTAINS_OPERATION("contains");
35 const QString MarkerUtils::REGEXP_OPERATION("regexp");
36 
valueToString(MarkerDataType dataType,const QVariantList & value,QString & string)37 void MarkerUtils::valueToString(MarkerDataType dataType, const QVariantList &value, QString &string) {
38     assert(value.size() >= 1);
39     if (REST_OPERATION == value.at(0).toString()) {
40         string.clear();
41         string.append(REST_OPERATION);
42         return;
43     }
44     if (INTEGER == dataType) {
45         assert(value.size() > 1);
46         integerValueToString(value, string);
47     } else if (FLOAT == dataType) {
48         assert(value.size() > 1);
49         floatValueToString(value, string);
50     } else if (STRING == dataType) {
51         assert(2 == value.size());
52         textValueToString(value, string);
53     }
54 }
55 
stringToValue(MarkerDataType dataType,const QString & string,QVariantList & value)56 bool MarkerUtils::stringToValue(MarkerDataType dataType, const QString &string, QVariantList &value) {
57     if (REST_OPERATION == string) {
58         value.append(string);
59         return true;
60     }
61 
62     if (INTEGER == dataType) {
63         return stringToIntValue(string, value);
64     } else if (FLOAT == dataType) {
65         return stringToFloatValue(string, value);
66     } else if (STRING == dataType) {
67         return stringToTextValue(string, value);
68     }
69 
70     return false;
71 }
72 
stringToIntValue(const QString & string,QVariantList & value)73 bool MarkerUtils::stringToIntValue(const QString &string, QVariantList &value) {
74     bool ok = false;
75     if (string.startsWith(LESS_OPERATION)) {
76         QString number = string.right(string.length() - LESS_OPERATION.length());
77 
78         value.append(QVariant(LESS_OPERATION));
79         value.append(QVariant(number.toInt(&ok)));
80         return ok;
81     } else if (string.startsWith(GREATER_OPERATION)) {
82         QString number = string.right(string.length() - GREATER_OPERATION.length());
83 
84         value.append(QVariant(GREATER_OPERATION));
85         value.append(QVariant(number.toInt(&ok)));
86         return ok;
87     } else if (string.contains(INTERVAL_OPERATION)) {
88         int pos = string.indexOf(INTERVAL_OPERATION);
89         QString number1 = string.left(pos);
90         QString number2 = string.right(string.length() - pos - INTERVAL_OPERATION.length());
91 
92         value.append(QVariant(INTERVAL_OPERATION));
93         value.append(QVariant(number1.toInt(&ok)));
94 
95         bool ok2 = false;
96         value.append(QVariant(number2.toInt(&ok2)));
97         return (ok && ok2);
98     } else {
99         return false;
100     }
101 }
102 
stringToFloatValue(const QString & string,QVariantList & value)103 bool MarkerUtils::stringToFloatValue(const QString &string, QVariantList &value) {
104     bool ok = false;
105     if (string.startsWith(LESS_OPERATION)) {
106         QString number = string.right(string.length() - LESS_OPERATION.length());
107 
108         value.append(QVariant(LESS_OPERATION));
109         value.append(QVariant(number.toFloat(&ok)));
110         return ok;
111     } else if (string.startsWith(GREATER_OPERATION)) {
112         QString number = string.right(string.length() - GREATER_OPERATION.length());
113 
114         value.append(QVariant(GREATER_OPERATION));
115         value.append(QVariant(number.toFloat(&ok)));
116         return ok;
117     } else if (string.contains(INTERVAL_OPERATION)) {
118         int pos = string.indexOf(INTERVAL_OPERATION);
119         QString number1 = string.left(pos);
120         QString number2 = string.right(string.length() - pos - INTERVAL_OPERATION.length());
121 
122         value.append(QVariant(INTERVAL_OPERATION));
123         value.append(QVariant(number1.toFloat(&ok)));
124 
125         bool ok2 = false;
126         value.append(QVariant(number2.toFloat(&ok2)));
127         return (ok && ok2);
128     } else {
129         return false;
130     }
131 }
132 
stringToTextValue(const QString & string,QVariantList & value)133 bool MarkerUtils::stringToTextValue(const QString &string, QVariantList &value) {
134     QString expr;
135     QString operation;
136     if (string.startsWith(STARTS_OPERATION)) {
137         expr = string.right(string.length() - STARTS_OPERATION.length()).trimmed();
138         operation = STARTS_OPERATION;
139     } else if (string.startsWith(ENDS_OPERATION)) {
140         expr = string.right(string.length() - ENDS_OPERATION.length()).trimmed();
141         operation = ENDS_OPERATION;
142     } else if (string.startsWith(CONTAINS_OPERATION)) {
143         expr = string.right(string.length() - CONTAINS_OPERATION.length()).trimmed();
144         operation = CONTAINS_OPERATION;
145     } else if (string.startsWith(REGEXP_OPERATION)) {
146         expr = string.right(string.length() - REGEXP_OPERATION.length()).trimmed();
147         operation = REGEXP_OPERATION;
148     } else {
149         return false;
150     }
151 
152     value.append(QVariant(operation));
153     value.append(QVariant(expr));
154 
155     return true;
156 }
157 
integerValueToString(const QVariantList & value,QString & string)158 void MarkerUtils::integerValueToString(const QVariantList &value, QString &string) {
159     QString operation = value.at(0).toString();
160 
161     if (INTERVAL_OPERATION == operation) {
162         assert(3 == value.size());
163         bool ok1 = false;
164         bool ok2 = false;
165         QByteArray num1 = QByteArray::number(value.at(1).toInt(&ok1));
166         QByteArray num2 = QByteArray::number(value.at(2).toInt(&ok2));
167         string = num1 + INTERVAL_OPERATION + num2;
168         assert(ok1);
169         assert(ok2);
170     } else if (LESS_OPERATION == operation) {
171         assert(2 == value.size());
172         bool ok = false;
173         QByteArray num = QByteArray::number(value.at(1).toInt(&ok));
174         string = LESS_OPERATION + num;
175         assert(ok);
176     } else if (GREATER_OPERATION == operation) {
177         assert(2 == value.size());
178         bool ok = false;
179         QByteArray num = QByteArray::number(value.at(1).toInt(&ok));
180         string = GREATER_OPERATION + num;
181         assert(ok);
182     } else {
183         assert(0);
184     }
185 }
186 
floatValueToString(const QVariantList & value,QString & string)187 void MarkerUtils::floatValueToString(const QVariantList &value, QString &string) {
188     QString operation = value.at(0).toString();
189 
190     if (INTERVAL_OPERATION == operation) {
191         assert(3 == value.size());
192         bool ok1 = false;
193         bool ok2 = false;
194         QByteArray num1 = QByteArray::number(value.at(1).toFloat(&ok1));
195         QByteArray num2 = QByteArray::number(value.at(2).toFloat(&ok2));
196         string = num1 + INTERVAL_OPERATION + num2;
197         assert(ok1);
198         assert(ok2);
199     } else if (LESS_OPERATION == operation) {
200         assert(2 == value.size());
201         bool ok = false;
202         QByteArray num = QByteArray::number(value.at(1).toFloat(&ok));
203         string = LESS_OPERATION + num;
204         assert(ok);
205     } else if (GREATER_OPERATION == operation) {
206         assert(2 == value.size());
207         bool ok = false;
208         QByteArray num = QByteArray::number(value.at(1).toFloat(&ok));
209         string = GREATER_OPERATION + num;
210         assert(ok);
211     } else {
212         assert(0);
213     }
214 }
215 
textValueToString(const QVariantList & value,QString & string)216 void MarkerUtils::textValueToString(const QVariantList &value, QString &string) {
217     string += value.at(0).toString() + " ";
218     string += value.at(1).toString();
219 }
220 
221 }  // namespace U2
222