You need to sign in or sign up before continuing.
Commit f0d41f49 authored by Ali Saeed's avatar Ali Saeed

Update Leader class to make it's functions static

parent 23f07acd
package Registration_Discovery;
import io.grpc.stub.StreamObserver;
import org.lognet.springboot.grpc.GRpcService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
......@@ -16,87 +19,86 @@ import java.util.*;
public class Leader {
private int PORT = 12345;
private ServiceRegistry serviceRegistry;
List<DocumentTermsInfo> documentTermsInfo;
static List<DocumentTermsInfo> documentTermsInfo;
private static final String FOLDER_PATH = "D:\\DS_Project\\resources";
private static final Logger logger = LoggerFactory.getLogger(Leader.class);
public Leader(int port, ServiceRegistry serviceRegistry) {
this.PORT = port;
this.serviceRegistry = serviceRegistry;
public Leader() {
}
public void start() throws IOException, InterruptedException {
String searchQuery = "";
while (!searchQuery.equals("exit")) {
documentTermsInfo = new ArrayList<>();
Scanner scanner = new Scanner(System.in);
logger.info("Enter your Search Query: ");
searchQuery = scanner.nextLine();
logger.info("Search Query: "+searchQuery);
if(!searchQuery.isEmpty()){
// Get the list of documents from the resources folder
List<Document> documents = getDocumentsFromResources();
Map<Document,Double> documentsScores = new HashMap<>();
List<String> allServiceAddresses = serviceRegistry.getAllServiceAddresses();
int numAddresses = allServiceAddresses.size();
int numDocuments = documents.size();
if(numAddresses != 0){
if(numDocuments != 0){
int documentsPerAddress = numDocuments / numAddresses;
int remainingDocuments = numDocuments % numAddresses;
List<Thread> threads = new ArrayList<>();
int startIndex = 0;
for (String address : allServiceAddresses) {
int endIndex = startIndex + documentsPerAddress;
if (remainingDocuments > 0) {
endIndex++;
remainingDocuments--;
}
List<Document> subDocuments = new ArrayList<>();
for(int i= startIndex; i<endIndex;i++){
subDocuments.add(documents.get(i));
}
startIndex = endIndex;
DataForSearch dataForSearch = new DataForSearch(searchQuery, subDocuments);
Thread thread = new Thread(() -> {
try {
startSearchOnWorker(address, dataForSearch);
} catch (IOException | InterruptedException e) {
e.printStackTrace();
logger.error("Interrupted while searching on workers: {}", e.getMessage());
}
});
thread.start();
threads.add(thread);
public static TreeMap<String,Double> start(String searchQuery1) throws IOException, InterruptedException {
String searchQuery = searchQuery1;
documentTermsInfo = new ArrayList<>();
logger.info("Search Query: "+searchQuery);
if(!searchQuery.isEmpty()){
// Get the list of documents from the resources folder
List<Document> documents = getDocumentsFromResources();
Map<Document,Double> documentsScores = new HashMap<>();
List<String> allServiceAddresses = ServiceRegistry.getAllServiceAddresses();
int numAddresses = allServiceAddresses.size();
int numDocuments = documents.size();
if(numAddresses != 0){
if(numDocuments != 0){
int documentsPerAddress = numDocuments / numAddresses;
int remainingDocuments = numDocuments % numAddresses;
List<Thread> threads = new ArrayList<>();
int startIndex = 0;
for (String address : allServiceAddresses) {
int endIndex = startIndex + documentsPerAddress;
if (remainingDocuments > 0) {
endIndex++;
remainingDocuments--;
}
for (Thread thread : threads) {
thread.join();
List<Document> subDocuments = new ArrayList<>();
for(int i= startIndex; i<endIndex;i++){
subDocuments.add(documents.get(i));
}
logger.info("\n\n");
displayDocumentTermsInfos(documentTermsInfo);
Map<String,Double> IDFs = calculateIDF(documentTermsInfo, (double) numDocuments,searchQuery);
documentsScores = calculateDocumentsScore(IDFs ,documentTermsInfo);
TreeMap<Document, Double> sortedDocumentsScores = sortDocumentsScores(documentsScores);
displaySortedScores(sortedDocumentsScores);
startIndex = endIndex;
DataForSearch dataForSearch = new DataForSearch(searchQuery, subDocuments);
Thread thread = new Thread(() -> {
try {
startSearchOnWorker(address, dataForSearch);
} catch (IOException | InterruptedException e) {
e.printStackTrace();
logger.error("Interrupted while searching on workers: {}", e.getMessage());
}
});
thread.start();
threads.add(thread);
}
else {
logger.info("No results !!!!");
for (Thread thread : threads) {
thread.join();
}
logger.info("\n\n");
displayDocumentTermsInfos(documentTermsInfo);
Map<String,Double> IDFs = calculateIDF(documentTermsInfo, (double) numDocuments,searchQuery);
documentsScores = calculateDocumentsScore(IDFs ,documentTermsInfo);
TreeMap<Document, Double> sortedDocumentsScores = sortDocumentsScores(documentsScores);
displaySortedScores(sortedDocumentsScores);
TreeMap<String, Double> sortedDocumentsScores1 = sortDocumentsScores1(documentsScores);
return sortedDocumentsScores1;
}
else {
logger.info("Try again later !!!!");
logger.info("No results !!!!");
return null;
}
}else {
logger.info("Please enter search query !!!");
}
else {
logger.info("Try again later !!!!");
return null;
}
}else {
logger.info("Please enter search query !!!");
return null;
}
}
private Map<Document, Double> calculateDocumentsScore(Map<String, Double> idFs, List<DocumentTermsInfo> documentTermsInfo) {
private static Map<Document, Double> calculateDocumentsScore(Map<String, Double> idFs, List<DocumentTermsInfo> documentTermsInfo) {
Map<Document, Double> documentsScores = new TreeMap<>();
......@@ -114,7 +116,7 @@ public class Leader {
return documentsScores;
}
private List<Document> getDocumentsFromResources() {
private static List<Document> getDocumentsFromResources() {
List<Document> documents = new ArrayList<>();
try {
Path resourcesPath = Paths.get(FOLDER_PATH);
......@@ -133,7 +135,7 @@ public class Leader {
return documents;
}
private void displayDocumentTermsInfos(List<DocumentTermsInfo> documentTermsInfoList) {
private static void displayDocumentTermsInfos(List<DocumentTermsInfo> documentTermsInfoList) {
System.out.println();
System.out.println();
for (DocumentTermsInfo documentTermsInfo : documentTermsInfoList) {
......@@ -150,11 +152,11 @@ public class Leader {
logger.info("................................................");
}
}
private void startSearchOnWorker(String workerAddress,DataForSearch dataForSearch) throws IOException, InterruptedException {
private static void startSearchOnWorker(String workerAddress,DataForSearch dataForSearch) throws IOException, InterruptedException {
String[] addressParts = workerAddress.split(":");
int port = Integer.parseInt(addressParts[1]);
String ipAddress = addressParts[0];
logger.info(String.format("Searching on worker: %s ", ipAddress + ":" + port));
logger.info(String.format("Searching on worker: %s ", ipAddress + ":" + port));
try {
// Create a socket connection to the worker
Socket socket = new Socket(ipAddress, port);
......@@ -179,7 +181,7 @@ public class Leader {
}
}
private Map<String,Double> calculateIDF(List<DocumentTermsInfo> documentTermsInfo,Double totalDocuments ,String searchQuery){
private static Map<String,Double> calculateIDF(List<DocumentTermsInfo> documentTermsInfo,Double totalDocuments ,String searchQuery){
Map<String,Double> IDFs = new HashMap<>();
Map<String, Double> wordDocumentCount = new HashMap<>();
String[] queryWords = searchQuery.split("\\s+");
......@@ -219,7 +221,7 @@ public class Leader {
return IDFs;
}
private TreeMap<Document, Double> sortDocumentsScores(Map<Document, Double> documentsScores) {
private static TreeMap<Document, Double> sortDocumentsScores(Map<Document, Double> documentsScores) {
Comparator<Document> comparator = new Comparator<Document>() {
@Override
public int compare(Document doc1, Document doc2) {
......@@ -238,7 +240,31 @@ public class Leader {
sortedMap.putAll(documentsScores);
return sortedMap;
}
private void displaySortedScores(TreeMap<Document, Double> sortedScores) {
private static TreeMap<String, Double> sortDocumentsScores1(Map<Document, Double> documentsScores) {
Comparator<Document> comparator = new Comparator<Document>() {
@Override
public int compare(Document doc1, Document doc2) {
Double score1 = documentsScores.get(doc1);
Double score2 = documentsScores.get(doc2);
int scoreComparison = score2.compareTo(score1);
if (scoreComparison != 0) {
return scoreComparison;
} else {
return doc1.compareTo(doc2);
}
}
};
TreeMap<Document, Double> sortedMap = new TreeMap<>(comparator);
sortedMap.putAll(documentsScores);
TreeMap<String, Double> sortedMap1 = new TreeMap<>();
for (Map.Entry<Document, Double> entry : sortedMap.entrySet()) {
String documentName = entry.getKey().getName();
Double score = entry.getValue();
sortedMap1.put(documentName,score);
}
return sortedMap1;
}
private static void displaySortedScores(TreeMap<Document, Double> sortedScores) {
logger.info("Sorted Documents By Scores:");
for (Map.Entry<Document, Double> entry : sortedScores.entrySet()) {
Document document = entry.getKey();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment