From f96179ebc2b6590c5be1278a0c8c74f174a734d6 Mon Sep 17 00:00:00 2001 From: jsclose <jsclose@umich.edu> Date: Mon, 5 Mar 2018 19:34:14 -0500 Subject: [PATCH] trying to integrate parser and crawler --- CMakeLists.txt | 20 +- ParserEndToEndTest | Bin 0 -> 229488 bytes crawler/spider.cpp | 21 +- crawler/spider.h | 8 +- makefile | 387 ++++++++++++++++++++++++++++++------ parser/Parser.cpp | 106 ++++++++++ parser/Parser.h | 84 +------- parser/tests/parserTest.cpp | 17 +- shared/Document.cpp | 101 ++++++++++ shared/Document.h | 100 +--------- util/Stemmer.h | 4 +- util/Tokenizer.h | 2 +- util/stringProcessing.h | 5 +- 13 files changed, 604 insertions(+), 251 deletions(-) create mode 100755 ParserEndToEndTest create mode 100644 parser/Parser.cpp create mode 100644 shared/Document.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 7c0f522..5dcc721 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3,16 +3,23 @@ project(eecs398_search) set(CMAKE_CXX_STANDARD 11) -add_executable(eecs398_search +add_executable(search main.cpp shared/ProducerConsumerQueue.cpp shared/ProducerConsumerQueue.h - shared/ProducerConsumerQueue_test.cpp parser/Parser.h - parser/Parser.h + parser/Parser.h util/Tokenizer.h util/stringProcessing.h util/Stemmer.h) + + +add_executable(crawl main.cpp shared/ProducerConsumerQueue.h shared/ThreadClass.h shared/url.h crawler/crawler.cpp crawler/SocketReader.cpp crawler/StreamReader.h crawler/spider.cpp util/util.h crawler/LocalReader.h crawler/StreamReader.h parser/Parser.h shared/Document.cpp parser/Parser.cpp) + + +add_executable(test1 main.cpp shared/ProducerConsumerQueue.h + shared/ThreadClass.h crawler/crawler.cpp crawler/spider.cpp shared/url.h crawler/StreamReader.h util/util.cpp crawler/SocketReader.cpp crawler/SocketReader.h crawler/LocalReader.h ) + add_executable(StringProcessingTest util/stringProcessing.h util/Stemmer.h @@ -32,3 +39,10 @@ add_executable(ParserEndToEndTest shared/url.h parser/tests/parserTest.cpp) + + +find_package(OpenSSL REQUIRED) + +target_link_libraries(crawl OpenSSL::SSL) + +target_link_libraries(test1 OpenSSL::SSL) \ No newline at end of file diff --git a/ParserEndToEndTest b/ParserEndToEndTest new file mode 100755 index 0000000000000000000000000000000000000000..14ae4eaf767c4f83f33fc6ef6ca5de9218f6345b GIT binary patch literal 229488 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 Xge-m3O!hk4qadLlxkx+APt2cxn&eUN literal 0 HcmV?d00001 diff --git a/crawler/spider.cpp b/crawler/spider.cpp index 018f121..a19d257 100644 --- a/crawler/spider.cpp +++ b/crawler/spider.cpp @@ -6,18 +6,18 @@ #include "spider.h" +#include "../parser/Parser.h" #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #include <unistd.h> -#include "../util/util.h" #include "LocalReader.h" #include "SocketReader.h" #include "../shared/Document.h" - +#include "../util/util.h" size_t Spider::hash(const char * s){ { // http://www.cse.yorku.ca/~oz/hash.html @@ -62,7 +62,11 @@ void Spider::FuncToRun() string pathToDisk = util::GetCurrentWorkingDir() + "/crawlerOutput/" + to_string(docID)+ ".txt"; int fd = util::writeToNewFileToLocation( reader->buffer, pathToDisk); - //parser.parse(reader); + + /* + Document document ( currentUrl, reader->buffer ); + auto dictionary = parser.execute ( &document ); + */ cond = true; } else @@ -87,7 +91,10 @@ Takes a URL. Hashes it. Checks if the url is in the docMapLookup. If it is, chec */ - +/* + * Takes in a parsed url, creates a document object, writes information about the document to disk + * returns the begining position of the document on disk, stores that into the in memory lookup hash table +*/ bool Spider::writeDocToDisk(ParsedUrl url) { Document d(url); @@ -103,6 +110,12 @@ bool Spider::writeDocToDisk(ParsedUrl url) return true; } +/* + * + * Takes a parsed url, checks if its in the local in memory hash table of documents return false + * If url was crawled but past a certain point, reindexs or does not exist , indexes the doc + * and returns true + */ bool Spider::shouldURLbeCrawled( ParsedUrl url ) diff --git a/crawler/spider.h b/crawler/spider.h index a5d2a50..e1a99a2 100644 --- a/crawler/spider.h +++ b/crawler/spider.h @@ -9,6 +9,8 @@ #include<iostream> #include <unordered_map> #include "StreamReader.h" +#include "../parser/Parser.h" +#include "../util/util.h" using namespace std; @@ -20,8 +22,9 @@ public: Spider( string mode_in, ProducerConsumerQueue < string > *url_q_in, unordered_map < string, int > *doc_map_lookup_in ) - : mode( mode_in ), urlFrontier( url_q_in ), docMapLookup( doc_map_lookup_in ) - { }; + : mode( mode_in ), urlFrontier( url_q_in ), docMapLookup( doc_map_lookup_in ), parser( Parser( url_q_in)) + { + }; //Takes a url off of the url frontier @@ -45,6 +48,7 @@ public: private: int locationOnDisk; + Parser parser; ProducerConsumerQueue < string > *urlFrontier; string mode; unordered_map < string, int > *docMapLookup; diff --git a/makefile b/makefile index d639ab8..363ce8c 100644 --- a/makefile +++ b/makefile @@ -56,17 +56,6 @@ CMAKE_BINARY_DIR = /Users/jakeclose/Desktop/398/project/eecs398-search #============================================================================= # Targets provided globally by CMake. -# Special rule for the target rebuild_cache -rebuild_cache: - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake to regenerate build system..." - /Applications/CLion.app/Contents/bin/cmake/bin/cmake -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) -.PHONY : rebuild_cache - -# Special rule for the target rebuild_cache -rebuild_cache/fast: rebuild_cache - -.PHONY : rebuild_cache/fast - # Special rule for the target edit_cache edit_cache: @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "No interactive CMake dialog available..." @@ -78,6 +67,17 @@ edit_cache/fast: edit_cache .PHONY : edit_cache/fast +# Special rule for the target rebuild_cache +rebuild_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake to regenerate build system..." + /Applications/CLion.app/Contents/bin/cmake/bin/cmake -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : rebuild_cache + +# Special rule for the target rebuild_cache +rebuild_cache/fast: rebuild_cache + +.PHONY : rebuild_cache/fast + # The main all target all: cmake_check_build_system $(CMAKE_COMMAND) -E cmake_progress_start /Users/jakeclose/Desktop/398/project/eecs398-search/CMakeFiles /Users/jakeclose/Desktop/398/project/eecs398-search/CMakeFiles/progress.marks @@ -111,30 +111,95 @@ depend: .PHONY : depend #============================================================================= -# Target rules for targets named url_test +# Target rules for targets named ParserEndToEndTest + +# Build rule for target. +ParserEndToEndTest: cmake_check_build_system + $(MAKE) -f CMakeFiles/Makefile2 ParserEndToEndTest +.PHONY : ParserEndToEndTest + +# fast build rule for target. +ParserEndToEndTest/fast: + $(MAKE) -f CMakeFiles/ParserEndToEndTest.dir/build.make CMakeFiles/ParserEndToEndTest.dir/build +.PHONY : ParserEndToEndTest/fast + +#============================================================================= +# Target rules for targets named StemmerTest # Build rule for target. -url_test: cmake_check_build_system - $(MAKE) -f CMakeFiles/Makefile2 url_test -.PHONY : url_test +StemmerTest: cmake_check_build_system + $(MAKE) -f CMakeFiles/Makefile2 StemmerTest +.PHONY : StemmerTest # fast build rule for target. -url_test/fast: - $(MAKE) -f CMakeFiles/url_test.dir/build.make CMakeFiles/url_test.dir/build -.PHONY : url_test/fast +StemmerTest/fast: + $(MAKE) -f CMakeFiles/StemmerTest.dir/build.make CMakeFiles/StemmerTest.dir/build +.PHONY : StemmerTest/fast #============================================================================= -# Target rules for targets named main +# Target rules for targets named StringProcessingTest # Build rule for target. -main: cmake_check_build_system - $(MAKE) -f CMakeFiles/Makefile2 main -.PHONY : main +StringProcessingTest: cmake_check_build_system + $(MAKE) -f CMakeFiles/Makefile2 StringProcessingTest +.PHONY : StringProcessingTest # fast build rule for target. -main/fast: - $(MAKE) -f CMakeFiles/main.dir/build.make CMakeFiles/main.dir/build -.PHONY : main/fast +StringProcessingTest/fast: + $(MAKE) -f CMakeFiles/StringProcessingTest.dir/build.make CMakeFiles/StringProcessingTest.dir/build +.PHONY : StringProcessingTest/fast + +#============================================================================= +# Target rules for targets named TokenizerTest + +# Build rule for target. +TokenizerTest: cmake_check_build_system + $(MAKE) -f CMakeFiles/Makefile2 TokenizerTest +.PHONY : TokenizerTest + +# fast build rule for target. +TokenizerTest/fast: + $(MAKE) -f CMakeFiles/TokenizerTest.dir/build.make CMakeFiles/TokenizerTest.dir/build +.PHONY : TokenizerTest/fast + +#============================================================================= +# Target rules for targets named test1 + +# Build rule for target. +test1: cmake_check_build_system + $(MAKE) -f CMakeFiles/Makefile2 test1 +.PHONY : test1 + +# fast build rule for target. +test1/fast: + $(MAKE) -f CMakeFiles/test1.dir/build.make CMakeFiles/test1.dir/build +.PHONY : test1/fast + +#============================================================================= +# Target rules for targets named crawl + +# Build rule for target. +crawl: cmake_check_build_system + $(MAKE) -f CMakeFiles/Makefile2 crawl +.PHONY : crawl + +# fast build rule for target. +crawl/fast: + $(MAKE) -f CMakeFiles/crawl.dir/build.make CMakeFiles/crawl.dir/build +.PHONY : crawl/fast + +#============================================================================= +# Target rules for targets named search + +# Build rule for target. +search: cmake_check_build_system + $(MAKE) -f CMakeFiles/Makefile2 search +.PHONY : search + +# fast build rule for target. +search/fast: + $(MAKE) -f CMakeFiles/search.dir/build.make CMakeFiles/search.dir/build +.PHONY : search/fast crawler/SocketReader.o: crawler/SocketReader.cpp.o @@ -142,7 +207,8 @@ crawler/SocketReader.o: crawler/SocketReader.cpp.o # target to build an object file crawler/SocketReader.cpp.o: - $(MAKE) -f CMakeFiles/main.dir/build.make CMakeFiles/main.dir/crawler/SocketReader.cpp.o + $(MAKE) -f CMakeFiles/test1.dir/build.make CMakeFiles/test1.dir/crawler/SocketReader.cpp.o + $(MAKE) -f CMakeFiles/crawl.dir/build.make CMakeFiles/crawl.dir/crawler/SocketReader.cpp.o .PHONY : crawler/SocketReader.cpp.o crawler/SocketReader.i: crawler/SocketReader.cpp.i @@ -151,7 +217,8 @@ crawler/SocketReader.i: crawler/SocketReader.cpp.i # target to preprocess a source file crawler/SocketReader.cpp.i: - $(MAKE) -f CMakeFiles/main.dir/build.make CMakeFiles/main.dir/crawler/SocketReader.cpp.i + $(MAKE) -f CMakeFiles/test1.dir/build.make CMakeFiles/test1.dir/crawler/SocketReader.cpp.i + $(MAKE) -f CMakeFiles/crawl.dir/build.make CMakeFiles/crawl.dir/crawler/SocketReader.cpp.i .PHONY : crawler/SocketReader.cpp.i crawler/SocketReader.s: crawler/SocketReader.cpp.s @@ -160,7 +227,8 @@ crawler/SocketReader.s: crawler/SocketReader.cpp.s # target to generate assembly for a file crawler/SocketReader.cpp.s: - $(MAKE) -f CMakeFiles/main.dir/build.make CMakeFiles/main.dir/crawler/SocketReader.cpp.s + $(MAKE) -f CMakeFiles/test1.dir/build.make CMakeFiles/test1.dir/crawler/SocketReader.cpp.s + $(MAKE) -f CMakeFiles/crawl.dir/build.make CMakeFiles/crawl.dir/crawler/SocketReader.cpp.s .PHONY : crawler/SocketReader.cpp.s crawler/crawler.o: crawler/crawler.cpp.o @@ -169,7 +237,8 @@ crawler/crawler.o: crawler/crawler.cpp.o # target to build an object file crawler/crawler.cpp.o: - $(MAKE) -f CMakeFiles/main.dir/build.make CMakeFiles/main.dir/crawler/crawler.cpp.o + $(MAKE) -f CMakeFiles/test1.dir/build.make CMakeFiles/test1.dir/crawler/crawler.cpp.o + $(MAKE) -f CMakeFiles/crawl.dir/build.make CMakeFiles/crawl.dir/crawler/crawler.cpp.o .PHONY : crawler/crawler.cpp.o crawler/crawler.i: crawler/crawler.cpp.i @@ -178,7 +247,8 @@ crawler/crawler.i: crawler/crawler.cpp.i # target to preprocess a source file crawler/crawler.cpp.i: - $(MAKE) -f CMakeFiles/main.dir/build.make CMakeFiles/main.dir/crawler/crawler.cpp.i + $(MAKE) -f CMakeFiles/test1.dir/build.make CMakeFiles/test1.dir/crawler/crawler.cpp.i + $(MAKE) -f CMakeFiles/crawl.dir/build.make CMakeFiles/crawl.dir/crawler/crawler.cpp.i .PHONY : crawler/crawler.cpp.i crawler/crawler.s: crawler/crawler.cpp.s @@ -187,7 +257,8 @@ crawler/crawler.s: crawler/crawler.cpp.s # target to generate assembly for a file crawler/crawler.cpp.s: - $(MAKE) -f CMakeFiles/main.dir/build.make CMakeFiles/main.dir/crawler/crawler.cpp.s + $(MAKE) -f CMakeFiles/test1.dir/build.make CMakeFiles/test1.dir/crawler/crawler.cpp.s + $(MAKE) -f CMakeFiles/crawl.dir/build.make CMakeFiles/crawl.dir/crawler/crawler.cpp.s .PHONY : crawler/crawler.cpp.s crawler/spider.o: crawler/spider.cpp.o @@ -196,7 +267,8 @@ crawler/spider.o: crawler/spider.cpp.o # target to build an object file crawler/spider.cpp.o: - $(MAKE) -f CMakeFiles/main.dir/build.make CMakeFiles/main.dir/crawler/spider.cpp.o + $(MAKE) -f CMakeFiles/test1.dir/build.make CMakeFiles/test1.dir/crawler/spider.cpp.o + $(MAKE) -f CMakeFiles/crawl.dir/build.make CMakeFiles/crawl.dir/crawler/spider.cpp.o .PHONY : crawler/spider.cpp.o crawler/spider.i: crawler/spider.cpp.i @@ -205,7 +277,8 @@ crawler/spider.i: crawler/spider.cpp.i # target to preprocess a source file crawler/spider.cpp.i: - $(MAKE) -f CMakeFiles/main.dir/build.make CMakeFiles/main.dir/crawler/spider.cpp.i + $(MAKE) -f CMakeFiles/test1.dir/build.make CMakeFiles/test1.dir/crawler/spider.cpp.i + $(MAKE) -f CMakeFiles/crawl.dir/build.make CMakeFiles/crawl.dir/crawler/spider.cpp.i .PHONY : crawler/spider.cpp.i crawler/spider.s: crawler/spider.cpp.s @@ -214,7 +287,8 @@ crawler/spider.s: crawler/spider.cpp.s # target to generate assembly for a file crawler/spider.cpp.s: - $(MAKE) -f CMakeFiles/main.dir/build.make CMakeFiles/main.dir/crawler/spider.cpp.s + $(MAKE) -f CMakeFiles/test1.dir/build.make CMakeFiles/test1.dir/crawler/spider.cpp.s + $(MAKE) -f CMakeFiles/crawl.dir/build.make CMakeFiles/crawl.dir/crawler/spider.cpp.s .PHONY : crawler/spider.cpp.s main.o: main.cpp.o @@ -223,7 +297,9 @@ main.o: main.cpp.o # target to build an object file main.cpp.o: - $(MAKE) -f CMakeFiles/main.dir/build.make CMakeFiles/main.dir/main.cpp.o + $(MAKE) -f CMakeFiles/test1.dir/build.make CMakeFiles/test1.dir/main.cpp.o + $(MAKE) -f CMakeFiles/crawl.dir/build.make CMakeFiles/crawl.dir/main.cpp.o + $(MAKE) -f CMakeFiles/search.dir/build.make CMakeFiles/search.dir/main.cpp.o .PHONY : main.cpp.o main.i: main.cpp.i @@ -232,7 +308,9 @@ main.i: main.cpp.i # target to preprocess a source file main.cpp.i: - $(MAKE) -f CMakeFiles/main.dir/build.make CMakeFiles/main.dir/main.cpp.i + $(MAKE) -f CMakeFiles/test1.dir/build.make CMakeFiles/test1.dir/main.cpp.i + $(MAKE) -f CMakeFiles/crawl.dir/build.make CMakeFiles/crawl.dir/main.cpp.i + $(MAKE) -f CMakeFiles/search.dir/build.make CMakeFiles/search.dir/main.cpp.i .PHONY : main.cpp.i main.s: main.cpp.s @@ -241,35 +319,199 @@ main.s: main.cpp.s # target to generate assembly for a file main.cpp.s: - $(MAKE) -f CMakeFiles/main.dir/build.make CMakeFiles/main.dir/main.cpp.s + $(MAKE) -f CMakeFiles/test1.dir/build.make CMakeFiles/test1.dir/main.cpp.s + $(MAKE) -f CMakeFiles/crawl.dir/build.make CMakeFiles/crawl.dir/main.cpp.s + $(MAKE) -f CMakeFiles/search.dir/build.make CMakeFiles/search.dir/main.cpp.s .PHONY : main.cpp.s -shared/urlTest.o: shared/urlTest.cpp.o +parser/Parser.o: parser/Parser.cpp.o + +.PHONY : parser/Parser.o + +# target to build an object file +parser/Parser.cpp.o: + $(MAKE) -f CMakeFiles/crawl.dir/build.make CMakeFiles/crawl.dir/parser/Parser.cpp.o +.PHONY : parser/Parser.cpp.o + +parser/Parser.i: parser/Parser.cpp.i + +.PHONY : parser/Parser.i + +# target to preprocess a source file +parser/Parser.cpp.i: + $(MAKE) -f CMakeFiles/crawl.dir/build.make CMakeFiles/crawl.dir/parser/Parser.cpp.i +.PHONY : parser/Parser.cpp.i + +parser/Parser.s: parser/Parser.cpp.s + +.PHONY : parser/Parser.s + +# target to generate assembly for a file +parser/Parser.cpp.s: + $(MAKE) -f CMakeFiles/crawl.dir/build.make CMakeFiles/crawl.dir/parser/Parser.cpp.s +.PHONY : parser/Parser.cpp.s + +parser/tests/parserTest.o: parser/tests/parserTest.cpp.o + +.PHONY : parser/tests/parserTest.o + +# target to build an object file +parser/tests/parserTest.cpp.o: + $(MAKE) -f CMakeFiles/ParserEndToEndTest.dir/build.make CMakeFiles/ParserEndToEndTest.dir/parser/tests/parserTest.cpp.o +.PHONY : parser/tests/parserTest.cpp.o + +parser/tests/parserTest.i: parser/tests/parserTest.cpp.i + +.PHONY : parser/tests/parserTest.i + +# target to preprocess a source file +parser/tests/parserTest.cpp.i: + $(MAKE) -f CMakeFiles/ParserEndToEndTest.dir/build.make CMakeFiles/ParserEndToEndTest.dir/parser/tests/parserTest.cpp.i +.PHONY : parser/tests/parserTest.cpp.i + +parser/tests/parserTest.s: parser/tests/parserTest.cpp.s + +.PHONY : parser/tests/parserTest.s + +# target to generate assembly for a file +parser/tests/parserTest.cpp.s: + $(MAKE) -f CMakeFiles/ParserEndToEndTest.dir/build.make CMakeFiles/ParserEndToEndTest.dir/parser/tests/parserTest.cpp.s +.PHONY : parser/tests/parserTest.cpp.s + +shared/Document.o: shared/Document.cpp.o + +.PHONY : shared/Document.o + +# target to build an object file +shared/Document.cpp.o: + $(MAKE) -f CMakeFiles/crawl.dir/build.make CMakeFiles/crawl.dir/shared/Document.cpp.o +.PHONY : shared/Document.cpp.o + +shared/Document.i: shared/Document.cpp.i + +.PHONY : shared/Document.i + +# target to preprocess a source file +shared/Document.cpp.i: + $(MAKE) -f CMakeFiles/crawl.dir/build.make CMakeFiles/crawl.dir/shared/Document.cpp.i +.PHONY : shared/Document.cpp.i + +shared/Document.s: shared/Document.cpp.s + +.PHONY : shared/Document.s + +# target to generate assembly for a file +shared/Document.cpp.s: + $(MAKE) -f CMakeFiles/crawl.dir/build.make CMakeFiles/crawl.dir/shared/Document.cpp.s +.PHONY : shared/Document.cpp.s + +shared/ProducerConsumerQueue.o: shared/ProducerConsumerQueue.cpp.o -.PHONY : shared/urlTest.o +.PHONY : shared/ProducerConsumerQueue.o # target to build an object file -shared/urlTest.cpp.o: - $(MAKE) -f CMakeFiles/url_test.dir/build.make CMakeFiles/url_test.dir/shared/urlTest.cpp.o -.PHONY : shared/urlTest.cpp.o +shared/ProducerConsumerQueue.cpp.o: + $(MAKE) -f CMakeFiles/search.dir/build.make CMakeFiles/search.dir/shared/ProducerConsumerQueue.cpp.o +.PHONY : shared/ProducerConsumerQueue.cpp.o -shared/urlTest.i: shared/urlTest.cpp.i +shared/ProducerConsumerQueue.i: shared/ProducerConsumerQueue.cpp.i -.PHONY : shared/urlTest.i +.PHONY : shared/ProducerConsumerQueue.i # target to preprocess a source file -shared/urlTest.cpp.i: - $(MAKE) -f CMakeFiles/url_test.dir/build.make CMakeFiles/url_test.dir/shared/urlTest.cpp.i -.PHONY : shared/urlTest.cpp.i +shared/ProducerConsumerQueue.cpp.i: + $(MAKE) -f CMakeFiles/search.dir/build.make CMakeFiles/search.dir/shared/ProducerConsumerQueue.cpp.i +.PHONY : shared/ProducerConsumerQueue.cpp.i -shared/urlTest.s: shared/urlTest.cpp.s +shared/ProducerConsumerQueue.s: shared/ProducerConsumerQueue.cpp.s -.PHONY : shared/urlTest.s +.PHONY : shared/ProducerConsumerQueue.s # target to generate assembly for a file -shared/urlTest.cpp.s: - $(MAKE) -f CMakeFiles/url_test.dir/build.make CMakeFiles/url_test.dir/shared/urlTest.cpp.s -.PHONY : shared/urlTest.cpp.s +shared/ProducerConsumerQueue.cpp.s: + $(MAKE) -f CMakeFiles/search.dir/build.make CMakeFiles/search.dir/shared/ProducerConsumerQueue.cpp.s +.PHONY : shared/ProducerConsumerQueue.cpp.s + +util/tests/stemmerTest.o: util/tests/stemmerTest.cpp.o + +.PHONY : util/tests/stemmerTest.o + +# target to build an object file +util/tests/stemmerTest.cpp.o: + $(MAKE) -f CMakeFiles/StemmerTest.dir/build.make CMakeFiles/StemmerTest.dir/util/tests/stemmerTest.cpp.o +.PHONY : util/tests/stemmerTest.cpp.o + +util/tests/stemmerTest.i: util/tests/stemmerTest.cpp.i + +.PHONY : util/tests/stemmerTest.i + +# target to preprocess a source file +util/tests/stemmerTest.cpp.i: + $(MAKE) -f CMakeFiles/StemmerTest.dir/build.make CMakeFiles/StemmerTest.dir/util/tests/stemmerTest.cpp.i +.PHONY : util/tests/stemmerTest.cpp.i + +util/tests/stemmerTest.s: util/tests/stemmerTest.cpp.s + +.PHONY : util/tests/stemmerTest.s + +# target to generate assembly for a file +util/tests/stemmerTest.cpp.s: + $(MAKE) -f CMakeFiles/StemmerTest.dir/build.make CMakeFiles/StemmerTest.dir/util/tests/stemmerTest.cpp.s +.PHONY : util/tests/stemmerTest.cpp.s + +util/tests/stringProcessingTest.o: util/tests/stringProcessingTest.cpp.o + +.PHONY : util/tests/stringProcessingTest.o + +# target to build an object file +util/tests/stringProcessingTest.cpp.o: + $(MAKE) -f CMakeFiles/StringProcessingTest.dir/build.make CMakeFiles/StringProcessingTest.dir/util/tests/stringProcessingTest.cpp.o +.PHONY : util/tests/stringProcessingTest.cpp.o + +util/tests/stringProcessingTest.i: util/tests/stringProcessingTest.cpp.i + +.PHONY : util/tests/stringProcessingTest.i + +# target to preprocess a source file +util/tests/stringProcessingTest.cpp.i: + $(MAKE) -f CMakeFiles/StringProcessingTest.dir/build.make CMakeFiles/StringProcessingTest.dir/util/tests/stringProcessingTest.cpp.i +.PHONY : util/tests/stringProcessingTest.cpp.i + +util/tests/stringProcessingTest.s: util/tests/stringProcessingTest.cpp.s + +.PHONY : util/tests/stringProcessingTest.s + +# target to generate assembly for a file +util/tests/stringProcessingTest.cpp.s: + $(MAKE) -f CMakeFiles/StringProcessingTest.dir/build.make CMakeFiles/StringProcessingTest.dir/util/tests/stringProcessingTest.cpp.s +.PHONY : util/tests/stringProcessingTest.cpp.s + +util/tests/tokenizerTest.o: util/tests/tokenizerTest.cpp.o + +.PHONY : util/tests/tokenizerTest.o + +# target to build an object file +util/tests/tokenizerTest.cpp.o: + $(MAKE) -f CMakeFiles/TokenizerTest.dir/build.make CMakeFiles/TokenizerTest.dir/util/tests/tokenizerTest.cpp.o +.PHONY : util/tests/tokenizerTest.cpp.o + +util/tests/tokenizerTest.i: util/tests/tokenizerTest.cpp.i + +.PHONY : util/tests/tokenizerTest.i + +# target to preprocess a source file +util/tests/tokenizerTest.cpp.i: + $(MAKE) -f CMakeFiles/TokenizerTest.dir/build.make CMakeFiles/TokenizerTest.dir/util/tests/tokenizerTest.cpp.i +.PHONY : util/tests/tokenizerTest.cpp.i + +util/tests/tokenizerTest.s: util/tests/tokenizerTest.cpp.s + +.PHONY : util/tests/tokenizerTest.s + +# target to generate assembly for a file +util/tests/tokenizerTest.cpp.s: + $(MAKE) -f CMakeFiles/TokenizerTest.dir/build.make CMakeFiles/TokenizerTest.dir/util/tests/tokenizerTest.cpp.s +.PHONY : util/tests/tokenizerTest.cpp.s util/util.o: util/util.cpp.o @@ -277,7 +519,7 @@ util/util.o: util/util.cpp.o # target to build an object file util/util.cpp.o: - $(MAKE) -f CMakeFiles/main.dir/build.make CMakeFiles/main.dir/util/util.cpp.o + $(MAKE) -f CMakeFiles/test1.dir/build.make CMakeFiles/test1.dir/util/util.cpp.o .PHONY : util/util.cpp.o util/util.i: util/util.cpp.i @@ -286,7 +528,7 @@ util/util.i: util/util.cpp.i # target to preprocess a source file util/util.cpp.i: - $(MAKE) -f CMakeFiles/main.dir/build.make CMakeFiles/main.dir/util/util.cpp.i + $(MAKE) -f CMakeFiles/test1.dir/build.make CMakeFiles/test1.dir/util/util.cpp.i .PHONY : util/util.cpp.i util/util.s: util/util.cpp.s @@ -295,7 +537,7 @@ util/util.s: util/util.cpp.s # target to generate assembly for a file util/util.cpp.s: - $(MAKE) -f CMakeFiles/main.dir/build.make CMakeFiles/main.dir/util/util.cpp.s + $(MAKE) -f CMakeFiles/test1.dir/build.make CMakeFiles/test1.dir/util/util.cpp.s .PHONY : util/util.cpp.s # Help Target @@ -304,10 +546,15 @@ help: @echo "... all (the default if no target is provided)" @echo "... clean" @echo "... depend" - @echo "... rebuild_cache" @echo "... edit_cache" - @echo "... url_test" - @echo "... main" + @echo "... ParserEndToEndTest" + @echo "... rebuild_cache" + @echo "... StemmerTest" + @echo "... StringProcessingTest" + @echo "... TokenizerTest" + @echo "... test1" + @echo "... crawl" + @echo "... search" @echo "... crawler/SocketReader.o" @echo "... crawler/SocketReader.i" @echo "... crawler/SocketReader.s" @@ -320,9 +567,27 @@ help: @echo "... main.o" @echo "... main.i" @echo "... main.s" - @echo "... shared/urlTest.o" - @echo "... shared/urlTest.i" - @echo "... shared/urlTest.s" + @echo "... parser/Parser.o" + @echo "... parser/Parser.i" + @echo "... parser/Parser.s" + @echo "... parser/tests/parserTest.o" + @echo "... parser/tests/parserTest.i" + @echo "... parser/tests/parserTest.s" + @echo "... shared/Document.o" + @echo "... shared/Document.i" + @echo "... shared/Document.s" + @echo "... shared/ProducerConsumerQueue.o" + @echo "... shared/ProducerConsumerQueue.i" + @echo "... shared/ProducerConsumerQueue.s" + @echo "... util/tests/stemmerTest.o" + @echo "... util/tests/stemmerTest.i" + @echo "... util/tests/stemmerTest.s" + @echo "... util/tests/stringProcessingTest.o" + @echo "... util/tests/stringProcessingTest.i" + @echo "... util/tests/stringProcessingTest.s" + @echo "... util/tests/tokenizerTest.o" + @echo "... util/tests/tokenizerTest.i" + @echo "... util/tests/tokenizerTest.s" @echo "... util/util.o" @echo "... util/util.i" @echo "... util/util.s" diff --git a/parser/Parser.cpp b/parser/Parser.cpp new file mode 100644 index 0000000..e412e36 --- /dev/null +++ b/parser/Parser.cpp @@ -0,0 +1,106 @@ +// +// Created by Jake Close on 3/5/18. +// + + + +#include "Parser.h" + + +/** + * Parses file + * @param inFile + * @return + */ +//TODO instead of grabbing each line, look to see if beginning of +// TODO title/url/anchortext, etc. Then continue until close tag and add to tokenizer after end of tag found +void Parser::parse ( string html, Tokenizer *tokenizer ) + { + auto htmlIt = html.begin(); + int offset = 0; + while (htmlIt != html.end()) + { + // if open bracket + if ( *htmlIt == '<' ) + { + auto begCloseTag = findNext ("</", htmlIt); + auto endCloseTag = findNext ( ">", begCloseTag); + string line (htmlIt, endCloseTag + 1); + htmlIt = endCloseTag + 2; + + // check if line is url + string url = extract_url ( line ); + if (url != "") + { + urlFrontier->Push ( url ); + } + // check if line is title + else + { + string title = extract_title ( line ); + if (title != "") + { + tokenizer->execute ( title, offset ); + } + } + //TODO fix offset? + offset = htmlIt - html.begin(); + } + else + { + ++htmlIt; + } + } + + + } + +/** + * Returns a url, or "" if none + * @param word + * @return + */ +string Parser::extract_url ( string word ) + { + string url = ""; + if ( *findStr ( "<a", word ) != '\0' ) + { + auto foundHref = findStr ( "href", word ); + auto foundHttp = findNext ( "http", foundHref ); + if ( *foundHttp != '\0' ) + { + url = ""; + auto closeTag = findNext ( ">", word.begin ( ) ); + while ( *foundHttp != *closeTag ) + { + url += *foundHttp; + ++foundHttp; + } + } + } + + return url; + } + +/** + * Returns a title, or "" if none + * @param word + * @return + */ +string Parser::extract_title ( string & word ) + { + string title = ""; + char end = '<'; + auto pos = findStr ( "<title>", word ); + if ( *pos != '\0') + { + pos += 7; + while ( *pos != end ) + { + title += *pos; + ++pos; + } + } + return title; + } + diff --git a/parser/Parser.h b/parser/Parser.h index 5d1c166..17e5258 100644 --- a/parser/Parser.h +++ b/parser/Parser.h @@ -6,7 +6,7 @@ // tokenizer returns pointer to document dictionary, parser puts it on the indexer's queue // - +#pragma once #include <string> #include <functional> #include <queue> @@ -17,6 +17,7 @@ #include "../shared/Document.h" #include "../shared/ProducerConsumerQueue.h" + using namespace std; /** @@ -56,95 +57,24 @@ private: */ //TODO instead of grabbing each line, look to see if beginning of // TODO title/url/anchortext, etc. Then continue until close tag and add to tokenizer after end of tag found - void parse ( string html, Tokenizer *tokenizer ) - { - auto htmlIt = html.begin(); - int offset = 0; - while (htmlIt != html.end()) - { - // if open bracket - if ( *htmlIt == '<' ) - { - auto begCloseTag = findNext ("</", htmlIt); - auto endCloseTag = findNext ( ">", begCloseTag); - string line (htmlIt, endCloseTag + 1); - htmlIt = endCloseTag + 2; - - // check if line is url - string url = extract_url ( line ); - if (url != "") - { - urlFrontier->Push ( url ); - } - // check if line is title - else - { - string title = extract_title ( line ); - if (title != "") - { - tokenizer->execute ( title, offset ); - } - } - //TODO fix offset? - offset = htmlIt - html.begin(); - } - else - { - ++htmlIt; - } - } + void parse ( string html, Tokenizer *tokenizer ); - } - /** * Returns a url, or "" if none * @param word * @return */ - string extract_url ( string word ) - { - string url = ""; - if ( *findStr ( "<a", word ) != '\0' ) - { - auto foundHref = findStr ( "href", word ); - auto foundHttp = findNext ( "http", foundHref ); - if ( *foundHttp != '\0' ) - { - url = ""; - auto closeTag = findNext ( ">", word.begin ( ) ); - while ( *foundHttp != *closeTag ) - { - url += *foundHttp; - ++foundHttp; - } - } - } - - return url; - } + string extract_url ( string word ); + /** * Returns a title, or "" if none * @param word * @return */ - string extract_title ( string & word ) - { - string title = ""; - char end = '<'; - auto pos = findStr ( "<title>", word ); - if ( *pos != '\0') - { - pos += 7; - while ( *pos != end ) - { - title += *pos; - ++pos; - } - } - return title; - } + string extract_title ( string & word ); + }; diff --git a/parser/tests/parserTest.cpp b/parser/tests/parserTest.cpp index 07d973e..75c6cc8 100644 --- a/parser/tests/parserTest.cpp +++ b/parser/tests/parserTest.cpp @@ -27,7 +27,10 @@ void testSimple ( ) { ProducerConsumerQueue < string > urlFrontierTest; - Document document ( "<title>This Cat Title Cat</title>" ); + ParsedUrl url = ParsedUrl("testurl.com"); + char docString[10240]; + strcpy(docString, "<title>This Cat Title Cat</title>"); + Document document ( url, docString); Parser parser ( &urlFrontierTest ); auto dictionary = parser.execute ( &document ); @@ -49,13 +52,15 @@ void testComplex ( ) ProducerConsumerQueue < string > urlFrontierTest; ifstream file("../tests/cats.html"); string temp; - string docString = "<title>Joe the Cat</title>\n"; - docString += "<a href=\"https://www.w3schools.com/html/\">Visit our HTML tutorial</a>\n"; + char docString[10240]; + strcpy(docString, "<title>Joe the Cat</title>\n"); + + strcat(docString, "<a href=\"https://www.w3schools.com/html/\">Visit our HTML tutorial</a>\n"); while(std::getline(file, temp)) { - docString += temp; + //strcat(docString, str(temp)); } - - Document document ( docString ); + ParsedUrl url = ParsedUrl("https://www.w3schools.com/tests/cats.html"); + Document document ( url, docString ); Parser parser ( &urlFrontierTest ); auto dictionary = parser.execute ( &document ); diff --git a/shared/Document.cpp b/shared/Document.cpp new file mode 100644 index 0000000..204dde3 --- /dev/null +++ b/shared/Document.cpp @@ -0,0 +1,101 @@ +// +// Created by Jake Close on 3/5/18. +// + + + +#include "Document.h" + +string Document::DocToString ( ) + { + return string ( docString, strlen ( docString ) ) + "\n"; + } + +int Document::WriteToDocMap ( ) + { + + pthread_mutex_lock ( &docMap_mutex ); + + //for now just write url + + string loc = util::GetCurrentWorkingDir ( ) + filepath::DOC_MAP; + int file = util::getFileDescriptor ( loc.c_str ( ), "W" ); + off_t resultPosition = 0; + + try + { + //check if its available + if ( file == -1 ) + { + throw ( "error opening docMap" ); + } + else + { + //get the current size of the docMap + size_t seekPosition = util::FileSize ( file ); + //seek to the end of the file + resultPosition = lseek ( file, seekPosition, SEEK_SET ); + + if ( resultPosition == -1 ) + { + throw ( "Could not seek" ); + } + cout << "Current docMap position on disk" << endl; + cout << resultPosition << endl; + + size_t success = write ( file, this->DocToString ( ).c_str ( ), + strlen ( this->DocToString ( ).c_str ( ) ) ); + if ( success == -1 ) + { + throw ( "Error writing document object to document map" ); + } + } + } + catch ( const char *str ) + { + cerr << str << endl; + close ( file ); + pthread_mutex_unlock ( &docMap_mutex ); + return -1; + } + close ( file ); + pthread_mutex_unlock ( &docMap_mutex ); + return resultPosition; + } + + +void Document::PrintDocMap ( string url, int location ) + { + pthread_mutex_lock ( &docMap_mutex ); + + std::cout << url << " is " << location; + + string loc = util::GetCurrentWorkingDir ( ) + filepath::DOC_MAP; + int file = util::getFileDescriptor ( loc.c_str ( ), "R" ); + + + //check if its available + if ( file ) + { + off_t resultPosition = lseek ( file, ( size_t ) location, SEEK_SET ); + int bytes = 14; + if ( bytes > 0 ) + { + char *buffer = new char[bytes]; + ssize_t bytesRead; + if ( bytesRead = read ( file, buffer, bytes ) ) + write ( 1, buffer, bytesRead ); + else + { + cerr << "Could not read " << bytes << " bytes at position " << + resultPosition << ", error = " << errno; + pthread_mutex_unlock ( &docMap_mutex ); + return; + } + } + + } + pthread_mutex_unlock ( &docMap_mutex ); + return; + +}; \ No newline at end of file diff --git a/shared/Document.h b/shared/Document.h index 5aca64d..acc5b6a 100644 --- a/shared/Document.h +++ b/shared/Document.h @@ -8,6 +8,7 @@ #include <string> #include <vector> #include <pthread.h> +#include "../util/util.h" using namespace std; @@ -23,107 +24,26 @@ class Document { private: ParsedUrl url; + char *docString; long docID; bool lastCrawlStatus; int lastCrawlDate; - int lastCrawlPageCount; + int lastCrawlWordCount; //add more info fields here public: - Document ( string url_in ) : url ( ParsedUrl ( url_in ) ) - { } - - string DocToString ( ) - { - return string ( url.CompleteUrl, strlen ( url.CompleteUrl ) ) + "\n"; - } - - int WriteToDocMap ( ) - { - - pthread_mutex_lock ( &docMap_mutex ); - - //for now just write url - - string loc = util::GetCurrentWorkingDir ( ) + filepath::DOC_MAP; - int file = util::getFileDescriptor ( loc.c_str ( ), "W" ); - off_t resultPosition = 0; - try - { - //check if its available - if ( file == -1 ) - { - throw ( "error opening docMap" ); - } - else - { - //get the current size of the docMap - size_t seekPosition = util::FileSize ( file ); - //seek to the end of the file - resultPosition = lseek ( file, seekPosition, SEEK_SET ); - - if ( resultPosition == -1 ) - { - throw ( "Could not seek" ); - } - cout << "Current docMap position on disk" << endl; - cout << resultPosition << endl; - - size_t success = write ( file, this->DocToString ( ).c_str ( ), - strlen ( this->DocToString ( ).c_str ( ) ) ); - if ( success == -1 ) - { - throw ( "Error writing document object to document map" ); - } - } - } - catch ( const char *str ) - { - cerr << str << endl; - close ( file ); - pthread_mutex_unlock ( &docMap_mutex ); - return -1; - } - close ( file ); - pthread_mutex_unlock ( &docMap_mutex ); - return resultPosition; - } - - - static void PrintDocMap ( string url, int location ) - { - pthread_mutex_lock ( &docMap_mutex ); + Document( ParsedUrl url_in ) : url((url_in)), docString( nullptr ) + { } - std::cout << url << " is " << location; + Document( ParsedUrl url_in, char *docStringIn ) : url((url_in)), docString( docStringIn ) + { } - string loc = util::GetCurrentWorkingDir ( ) + filepath::DOC_MAP; - int file = util::getFileDescriptor ( loc.c_str ( ), "R" ); + string DocToString(); + int WriteToDocMap(); - //check if its available - if ( file ) - { - off_t resultPosition = lseek ( file, ( size_t ) location, SEEK_SET ); - int bytes = 14; - if ( bytes > 0 ) - { - char *buffer = new char[bytes]; - ssize_t bytesRead; - if ( bytesRead = read ( file, buffer, bytes ) ) - write ( 1, buffer, bytesRead ); - else - { - cerr << "Could not read " << bytes << " bytes at position " << - resultPosition << ", error = " << errno; - pthread_mutex_unlock ( &docMap_mutex ); - return; - } - } - } - pthread_mutex_unlock ( &docMap_mutex ); - return; - } + static void PrintDocMap( string url, int location ); }; \ No newline at end of file diff --git a/util/Stemmer.h b/util/Stemmer.h index 84e1990..4acbf35 100644 --- a/util/Stemmer.h +++ b/util/Stemmer.h @@ -2,9 +2,8 @@ // Created by Veronica Day on 2/22/18. // -#ifndef EECS398_SEARCH_STEMMER_H -#define EECS398_SEARCH_STEMMER_H +#pragma once class Stemmer { @@ -12,4 +11,3 @@ class Stemmer }; -#endif //EECS398_SEARCH_STEMMER_H diff --git a/util/Tokenizer.h b/util/Tokenizer.h index 3de99f5..ba27e43 100644 --- a/util/Tokenizer.h +++ b/util/Tokenizer.h @@ -1,7 +1,7 @@ // // Created by anvia on 1/31/2018. // - +#pragma once #include <string> #include <unordered_map> #include <vector> diff --git a/util/stringProcessing.h b/util/stringProcessing.h index 40056e0..03c18a6 100644 --- a/util/stringProcessing.h +++ b/util/stringProcessing.h @@ -2,9 +2,7 @@ // Created by anvia on 1/31/2018. // -#ifndef EECS398_SEARCH_STRINGPROCESSING_H -#define EECS398_SEARCH_STRINGPROCESSING_H - +#pragma once #include <string> #include <unordered_map> #include <vector> @@ -201,4 +199,3 @@ string stemWord(string word) return ""; } -#endif //EECS398_SEARCH_STRINGPROCESSING_H -- GitLab