LCOV - code coverage report
Current view: top level - Servidor/Parsers - CsvParser.cpp (source / functions) Hit Total Coverage
Test: coverage_merged.info Lines: 180 186 96.8 %
Date: 2016-07-11 17:43:33 Functions: 14 15 93.3 %

          Line data    Source code
       1             : /*
       2             :  * CsvParser.cpp
       3             :  *
       4             :  *  Created on: Jun 16, 2016
       5             :  *      Author: tobias
       6             :  */
       7             : 
       8             : #include "CsvParser.h"
       9             : 
      10             : using namespace std;
      11             : 
      12         467 : CsvParser::CsvParser() {
      13             : 
      14         467 : }
      15             : 
      16         176 : vector<string> CsvParser::parseLine(string *line){
      17         176 :         vector<string> elements;
      18         352 :         stringstream ss(*line);
      19             : 
      20         352 :         string cell;
      21             : 
      22         176 :         if(line->empty() || line->size() <= 2){
      23           0 :                 return elements;
      24             :         }
      25             : 
      26        1688 :     while( ss.good() )
      27             :     {
      28        1336 :         getline( ss, cell, ',' );
      29        1336 :         cell = cell.substr(1, cell.length() );
      30        2677 :         while (*cell.rbegin() != '"' && ss.good() ){
      31           5 :                 string other_parts;
      32           5 :                 getline( ss, other_parts, ',' );
      33           5 :                 cell = cell + other_parts;
      34           5 :         }
      35             : 
      36        1336 :         cell = cell.substr( 0 , cell.length() - 1);
      37             : 
      38        1336 :         elements.push_back(cell);
      39             :     }
      40         176 :     return elements;
      41             : 
      42             : }
      43             : 
      44         132 : void CsvParser::splitInterest(string cell, string &key, string &value){
      45         132 :         stringstream ss(cell);
      46         264 :         string temp;
      47         132 :         LOGG(DEBUG) << "Spliting interest " << cell;
      48         528 :         while (ss.good()){
      49         264 :                 getline(ss, temp, ':');
      50             : 
      51         264 :                 if (ss.peek() == ':'){
      52         132 :                         ss.ignore();
      53         132 :                         key = temp;
      54             :                 }
      55         264 :                 value = temp;
      56             :         }
      57         264 :         LOGG(DEBUG)<< "Splited in "<< key << "," << value;
      58         132 : }
      59             : 
      60          65 : void CsvParser::makeInterests(string keyValues, Interests &interests){
      61         130 :         string key,value;
      62             : 
      63          65 :         if (keyValues.back() == '\"') {
      64           0 :                 keyValues.pop_back();
      65             :         }
      66             : 
      67         130 :         stringstream ss(keyValues);
      68             : 
      69         130 :         string cell;
      70         262 :         while (ss.good()) {
      71         132 :                 getline(ss, cell, '|');
      72             : 
      73         132 :                 if (ss.peek() == '|'){
      74          67 :                         ss.ignore();
      75             :                 }
      76             : 
      77         132 :                 this->splitInterest(cell, key, value);
      78             :                 //cout << key.c_str() << "," << value.c_str() << endl;
      79         132 :                 interests.add(key,value);
      80          65 :         }
      81             : 
      82          65 : }
      83             : 
      84          56 : bool CsvParser::makeUser(string user_str, User &user){
      85          56 :         vector<string> parsed = this->parseLine(&user_str);
      86         112 :         Interests interests;
      87          56 :         int desf = 0;
      88          56 :         int count_elem = parsed.size();
      89             : 
      90          56 :         if ( (count_elem < USER_DATA_COUNT - 1) || (count_elem > USER_DATA_COUNT)){
      91          10 :                 return false;
      92             :         }
      93             : 
      94          46 :         if (parsed.size() == USER_DATA_COUNT){
      95          36 :                 string idS = parsed[ID_FULL_IDX];
      96          36 :                 if ( ! isInteger(idS)){
      97           0 :                         return false;
      98             :                 }
      99          36 :                 int id = stoi(idS);
     100          36 :                 user.setId(id);
     101          36 :                 desf = 1;
     102             :         }else{
     103          10 :                 LOGG(WARNING) << "Parsing user without ID";
     104             :         }
     105          92 :         string xS = parsed[LOCX_FULL_IDX - 1 + desf];
     106          92 :         string yS = parsed[LOCY_FULL_IDX - 1 + desf];
     107          92 :         string age = parsed[AGE_IDX + desf];
     108             : 
     109             : 
     110          46 :         if (! isFloat(xS) || ! isFloat(yS) || ! isInteger(age)){
     111          15 :                 return false;
     112             :         }
     113             : 
     114          62 :         string name = parsed[NAME_IDX + desf];
     115          62 :         string alias = parsed[ALIAS_IDX + desf];
     116          62 :         string sex = parsed[SEX_IDX + desf];
     117          62 :         string mail = parsed[MAIL_IDX + desf];
     118          31 :         float x =stof(xS);
     119          31 :         float y =stof(yS);
     120             : 
     121          31 :         user.setCommonData(mail,alias,name,sex);
     122          31 :         user.setLocation(x,y);
     123          31 :         user.setAge(stoi(age));
     124          31 :         user.setDescription(parsed[DSC_IDX + desf]);
     125             : 
     126          31 :         this->makeInterests(parsed[INT_IDX + desf], interests);
     127          31 :         user.setInterests(interests);
     128             : 
     129          87 :         return true;
     130             : 
     131             : }
     132             : 
     133          20 : bool CsvParser::makeSignupUser(string user_str,User &user){
     134          20 :         vector<string> parsed = this->parseLine(&user_str);
     135             : 
     136          20 :         if (parsed.size() != USER_DATA_FOR_CLIENT_COUNT){
     137           0 :                 return false;
     138             :         }
     139             : 
     140          40 :         Interests interests;
     141          40 :         string age = parsed[AGE_IDX];
     142          40 :         string name = parsed[NAME_IDX];
     143          40 :         string alias = parsed[ALIAS_IDX];
     144          40 :         string sex = parsed[SEX_IDX];
     145          40 :         string mail = parsed[MAIL_IDX];
     146             : 
     147          20 :         if (! isInteger(age)){
     148           5 :                 return false;
     149             :         }
     150             : 
     151          15 :         user.setCommonData(mail, alias, name, sex);
     152             : 
     153             :         //defualt location
     154          15 :         user.setLocation(0, 0);
     155             : 
     156             : 
     157          15 :         user.setAge(stoi(age));
     158          15 :         user.setDescription(parsed[DSC_IDX]);
     159             : 
     160          15 :         this->makeInterests(parsed[INT_IDX], interests);
     161          15 :         user.setInterests(interests);
     162          35 :         return true;
     163             : }
     164             : 
     165          25 : bool CsvParser::makePutUser(string user_str, string base_user, User& user){
     166          25 :         vector<string> parsedOriginal = this->parseLine(&base_user);
     167          50 :         vector<string> modifications = this->parseLine(&user_str);
     168          50 :         vector<string> parsed = this->parseLine(&user_str);
     169             : 
     170          25 :         if ( modifications.size() > (USER_DATA_UPDATE_COUNT)){
     171          16 :                 return false;
     172             :         }
     173             :         //FromOriginal
     174          18 :         string idS = parsedOriginal[ID_FULL_IDX];
     175          18 :         string alias = parsedOriginal[ALIAS_FULL_IDX];
     176          18 :         string mail = parsedOriginal[MAIL_FULL_IDX];
     177          18 :         string xS = parsedOriginal[LOCX_FULL_IDX];
     178          18 :         string yS = parsedOriginal[LOCY_FULL_IDX];
     179             : 
     180             :         //Modifications
     181          18 :         string name = modifications[NAME_UPDATE_IDX];
     182          18 :         string age = modifications[AGE_UPDATE_IDX];
     183             : 
     184             :         //Modifications shuffled
     185          18 :         string sex = modifications[SEX_UPDATE_IDX];
     186           9 :         if ( ! isInteger(age) || ! isInteger(idS)){
     187           0 :                 return false;
     188             :         }
     189           9 :         if ( ! isFloat(xS) || ! isFloat(yS)){
     190           0 :                 return false;
     191             :         }
     192          18 :         Interests interests;
     193           9 :         this->makeInterests(modifications[INT_UPDATE_IDX], interests);
     194             : 
     195           9 :         float x = stof(xS);
     196           9 :         float y = stof(yS);
     197           9 :         int id = stoi(idS);
     198             : 
     199           9 :         user.setInterests(interests);
     200           9 :         user.setLocation(x, y);
     201           9 :         user.setId(id);
     202           9 :         user.setCommonData(mail, alias, name, sex);
     203           9 :         user.setAge(stoi(age));
     204             : 
     205          34 :         return true;
     206             : }
     207             : 
     208         124 : string CsvParser::userToCsvFull(User *user){
     209        1364 :         string user_str[USER_DATA_COUNT];
     210         124 :         string parsed = "\"";
     211             : 
     212         124 :         user_str[NAME_FULL_IDX] = user->getName();
     213         124 :         user_str[MAIL_FULL_IDX]= user->getMail();
     214         124 :         user_str[ALIAS_FULL_IDX] = user->getAlias();
     215         124 :         user_str[SEX_FULL_IDX] = user->getSex();
     216         124 :         user_str[AGE_FULL_IDX] = to_string(user->getAge());
     217         124 :         user_str[ID_FULL_IDX] = to_string(user->getID());
     218         124 :         user_str[DSC_FULL_IDX] = user->getDescription();
     219         124 :         user_str[LOCX_FULL_IDX] = to_string(user->getX());
     220         124 :         user_str[LOCY_FULL_IDX] = to_string(user->getY());
     221         124 :         user_str[INT_FULL_IDX] = this->interestToCsv(user->getInterests());
     222             : 
     223        1364 :         for (int i = 0; i < USER_DATA_COUNT; i++){
     224        1240 :                 parsed+= user_str[i] + "\",\"";
     225             :         }
     226         124 :         parsed = parsed.substr(0,parsed.length() - 2);
     227             : 
     228        1364 :         return parsed;
     229             : }
     230             : 
     231          10 : string CsvParser::userToCsvForClient(User *user, bool with_id){
     232          10 :         int addId = 0;
     233             : 
     234          10 :         if (with_id){
     235           5 :                 addId = 1;
     236             :         }
     237             : 
     238          95 :         string user_str[USER_DATA_FOR_CLIENT_COUNT + addId];
     239          10 :         string parsed = "\"";
     240             : 
     241          10 :         user_str[NAME_IDX + addId] = user->getName();
     242          10 :         user_str[MAIL_IDX + addId]= user->getMail();
     243          10 :         user_str[ALIAS_IDX + addId] = user->getAlias();
     244          10 :         user_str[SEX_IDX + addId] = user->getSex();
     245          10 :         user_str[AGE_IDX + addId] = to_string(user->getAge());
     246          10 :         user_str[DSC_IDX + addId] = user->getDescription();
     247          10 :         user_str[INT_IDX + addId] = this->interestToCsv(user->getInterests());
     248             : 
     249          10 :         if (with_id)
     250           5 :                 user_str[ID_FULL_IDX] = to_string(user->getID());
     251             : 
     252          85 :         for (int i = 0; i < USER_DATA_FOR_CLIENT_COUNT + addId; i++){
     253          75 :                 parsed+= user_str[i] + "\",\"";
     254             :         }
     255          10 :         parsed = parsed.substr(0,parsed.length() - 2);
     256             : 
     257          95 :         return parsed;
     258             : }
     259             : 
     260         139 : string CsvParser::interestToCsv(Interests * interests){
     261         139 :         string str = "";
     262         278 :         map<string,vector<string>> inter = interests->allInterests();
     263         139 :         map<string,vector<string>>::iterator it = inter.begin();
     264             : 
     265         431 :         for(; it != inter.end(); ++it){
     266         292 :                 string key = it->first;
     267         624 :                 for (unsigned int i = 0; i < it->second.size(); i++){
     268         332 :                         string value = it->second[i];
     269         332 :                         str += key + "::" + value + "||";
     270         332 :                 }
     271         292 :         }
     272             : 
     273         139 :         str = str.substr(0, str.length() - 2 );
     274             : 
     275         278 :         return str;
     276             : }
     277             : 
     278           5 : void CsvParser::removeId(string &data){
     279           5 :         vector<string> parsed = this->parseLine(&data);
     280          10 :         string user_str;
     281           5 :         parsed.erase(parsed.begin() + ID_FULL_IDX);
     282             : 
     283           5 :         user_str = "\"";
     284          40 :         for (unsigned int i = 0; i < parsed.size(); i++){
     285          35 :                 user_str+= parsed[i] + "\",\"";
     286             :                 }
     287          10 :         data = user_str.substr(0,user_str.length() - 2);
     288             : 
     289             : 
     290           5 : }
     291             : 
     292         467 : CsvParser::~CsvParser() {
     293         533 : }
     294             : 

Generated by: LCOV version 1.12-4-g04a3c0e