Added approximate pattern matching with Suffix Filters
[SXSI/TextCollection.git] / Query.cpp
diff --git a/Query.cpp b/Query.cpp
new file mode 100644 (file)
index 0000000..29b0bb1
--- /dev/null
+++ b/Query.cpp
@@ -0,0 +1,83 @@
+#include "Query.h"
+#include <cstring>
+
+namespace SXSI
+{
+
+const char Query::ALPHABET_DNA[] = {'A', 'C', 'G', 'T', 'N'};
+
+
+Query::Query(TextCollection const *tc_)
+    : pat(0), patlen(0), tc(tc_), debug(false), klimit(0), 
+      textlen(tc->getLength()), ALPHABET(ALPHABET_DNA)
+{ }
+
+
+/*void reverse()
+{
+    uchar c;
+    for (int i = 0; i < patlen / 2; ++i) {
+        c = pat[i];
+        pat[i] = pat[patlen - i - 1];
+        pat[patlen - i - 1] = c;
+    }
+}
+
+void revcmp()
+{
+    reverse();
+    for (int i = 0; i < patlen; ++i)
+        switch (pat[i]) 
+        {
+        case('A'): pat[i] = 'T'; break;
+        case('C'): pat[i] = 'G'; break;
+        case('G'): pat[i] = 'C'; break;
+        case('T'): pat[i] = 'A'; break;                
+        case('a'): pat[i] = 't'; break;                
+        case('c'): pat[i] = 'g'; break;
+        case('g'): pat[i] = 'c'; break;                
+        case('a'): pat[i] = 't'; break;                
+        case('N'): pat[i] = 'N'; break;                
+        case('n'): pat[i] = 'n'; break;                
+        default:
+            std::cerr << "Query::align(): invalid alphabet ("<< pat[i] << ") given!" << std::endl;
+            std::exit(1);
+            break;
+        }
+        }*/
+
+TextCollection::document_result Query::align(uchar const *p, unsigned k)
+{
+    result.clear();
+    this->pat = p;
+    this->patlen = std::strlen((char const *)p);
+    this->klimit = k;
+
+    while (!smin.empty()) smin.pop();
+    while (!smax.empty()) smax.pop();
+    smin.push(0);
+    smax.push(textlen-1);
+    match.clear();
+        
+    firstStep();
+
+    // Search reverse complemented?
+/*    {
+        revcmp();
+        this->pat = p->c_str();
+        while (!smin.empty()) smin.pop();
+        while (!smax.empty()) smax.pop();
+        smin.push(0);
+        smax.push(textlen-1);
+        match.clear();
+        
+        firstStep();
+
+        revcmp(); // Restore orig string
+        }*/
+
+    TextCollection::document_result dr(result.begin(), result.end());
+    return dr;
+}
+
+} // namespace