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