-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathOperations.cpp
More file actions
177 lines (124 loc) · 4.43 KB
/
Operations.cpp
File metadata and controls
177 lines (124 loc) · 4.43 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
//
// LogicalOperators.cpp
// Search_CPP1_5
//
// Created by Jatin Tayal on 28/07/19.
// Copyright © 2019 Adobe. All rights reserved.
//
#include "Operations.h"
#include "Dictionary.h"
#include <iostream>
#include <string>
#include <fstream>
extern Dictionary dictionary;
extern int totalIndexedFiles;
extern map<int, string> globalfileIndex;
map<int, int> Operations::operationAND(map<int, int> param1, map<int, int> param2) {
map<int, int> solution;
//int numOfFiles = ?
for(int i =0;i<totalIndexedFiles; i++){
int firstFileOccurence = 0;
int secondFileOccurence = 0;
if(param1.find(i) != param1.end()){
firstFileOccurence = param1[i];
}
if(param2.find(i) != param2.end()){
secondFileOccurence = param2[i];
}
solution[i] = firstFileOccurence <= secondFileOccurence ? firstFileOccurence : secondFileOccurence;
}
return solution;
}
map<int, int> Operations::operationOR(map<int, int> param1, map<int, int> param2) {
map<int, int> solution;
//int numOfFiles = ?
for(int i =0;i<totalIndexedFiles; i++){
int firstFileOccurence = 0;
int secondFileOccurence = 0;
if(param1.find(i) != param1.end()){
firstFileOccurence = param1[i];
}
if(param2.find(i) != param2.end()){
secondFileOccurence = param2[i];
}
solution[i] = firstFileOccurence >= secondFileOccurence ? firstFileOccurence : secondFileOccurence;
}
return solution;
}
map<int, int> Operations::operationSUM(map<int, int> param1, map<int, int> param2) {
map<int, int> solution;
for(int i =0;i<totalIndexedFiles; i++){
int firstFileOccurence = 0;
int secondFileOccurence = 0;
if(param1.find(i) != param1.end()){
firstFileOccurence = param1[i];
}
if(param2.find(i) != param2.end()){
secondFileOccurence = param2[i];
}
solution[i] = firstFileOccurence + secondFileOccurence ;
}
return solution;
}
map<int, int> Operations::performWordQuery(string queryString, string type){
if(type == "normal")
return dictionary.normalTrie.findWordDetails(queryString);
else
return dictionary.reverseTrie.findWordDetails(queryString);
}
int Operations::findOccurencesOfPhraseInFile(int fileIndex, string phrase){
int count = 0;
ifstream ifs(globalfileIndex[fileIndex]);
string fileContent( (std::istreambuf_iterator<char>(ifs) ),
(std::istreambuf_iterator<char>()) );
size_t pos = fileContent.find(phrase);
// Repeat till end is reached
while( pos != std::string::npos){
count++;
pos = fileContent.find(phrase, pos + phrase.size());
}
return count;
}
map<int, int> Operations::performPhraseQuery(string queryString){
map<int, int> res;
string trimmedPhrase = queryString.substr(1, queryString.length()-2);
string firstWord = "";
for(int j=0; j < trimmedPhrase.length(); j++){
if(trimmedPhrase[j] == ' '){
if(firstWord != ""){
break;
}
}
else{
firstWord += trimmedPhrase[j];
}
}
// debug(trimmedPhrase);
if(firstWord != ""){
map<int,int > filesInfo = dictionary.normalTrie.findWordDetails(firstWord); // finding list of files in which first word appears
map<int, int>::iterator it = filesInfo.begin();
while (it != filesInfo.end()) {
res[it->first] = findOccurencesOfPhraseInFile(it->first, trimmedPhrase);
it++;
}
}
return res;
}
map<int, int> Operations::performStemmingQuery(string queryString, string type){
map<int,int> res;
res.clear();
if(type == "normal"){
string trimmedQuery = queryString.substr(0, queryString.length()-1);
vector<string>validWords = dictionary.normalTrie.findValidWords(trimmedQuery);
for(int i=0; i<validWords.size(); i++)
res = operationSUM(res, performWordQuery(validWords[i], "normal"));
}
else{
reverse(queryString.begin(), queryString.end() );
string trimmedQuery = queryString.substr(0, queryString.length()-1);
vector<string>validWords = dictionary.reverseTrie.findValidWords(trimmedQuery);
for(int i=0; i<validWords.size(); i++)
res = operationSUM(res, performWordQuery(validWords[i], "reverse"));
}
return res;
}