Skip to content

Commit

Permalink
Merge pull request #9 from krshrimali/development/db/part-3
Browse files Browse the repository at this point in the history
Major revision: DB now contains per line indices, no overlapping needed
  • Loading branch information
krshrimali committed Jun 28, 2023
2 parents 1a184e7 + c073e38 commit b639749
Show file tree
Hide file tree
Showing 3 changed files with 170 additions and 241 deletions.
245 changes: 117 additions & 128 deletions src/algo_loc.rs
Expand Up @@ -4,81 +4,98 @@ use std::collections::HashMap;

pub fn get_unique_files_changed(
origin_file_path: String,
start_line_number: usize,
end_line_number: usize,
start_line_number: &usize,
end_line_number: &usize,
db_obj: &mut DB,
) -> String {
let configured_file_path: String = origin_file_path.clone();
let line_str: String = format!("{start_line_number}_{end_line_number}");
// Check in the DB first
let mut res = String::new();
let mut visited: HashMap<String, usize> = HashMap::new();
if let (Some(obj), search_field_second) = db_obj.exists(&configured_file_path, &line_str) {
// means nothing to do...
for author_detail in obj {
for each_file in author_detail.contextual_file_paths.clone() {
if visited.contains_key(&each_file) {
continue;
let (existing_result_optional, unvisited_indices) =
db_obj.exists_and_return(&origin_file_path, start_line_number, end_line_number);
match existing_result_optional {
Some(existing_result) => {
for author_detail in existing_result {
for each_file in author_detail.contextual_file_paths.clone() {
if visited.contains_key(&each_file) {
continue;
}
visited.insert(each_file.clone(), 1);
res.push_str(&each_file);
res.push(',');
}
visited.insert(each_file.clone(), 1);
res.push_str(&each_file);
res.push(',');
}
if res.ends_with(',') {
res.pop();
}
if !unvisited_indices.is_empty() {
// find if multiple splits are there
let mut res_string: String = res;
for each_unvisited_index in unvisited_indices {
res_string += &perform_for_single_line(
each_unvisited_index,
each_unvisited_index,
origin_file_path.clone(),
db_obj,
false,
);
}
return res_string;
}
res
}
if res.ends_with(',') {
res.pop();
}
if !search_field_second.is_empty() {
// find if multiple splits are there
let split_search_field: Vec<&str> = search_field_second.split('_').collect();
if split_search_field.len() == 4 {
let start_line_number: usize = split_search_field.first().unwrap().parse().unwrap();
let end_line_number: usize = split_search_field.get(1).unwrap().parse().unwrap();
let output = get_unique_files_changed(
None => {
let mut final_result = "".to_string();
for each_unvisited_index in unvisited_indices {
final_result += &perform_for_single_line(
each_unvisited_index,
each_unvisited_index,
origin_file_path.clone(),
start_line_number,
end_line_number,
db_obj,
);
let start_line_number: usize = split_search_field.get(2).unwrap().parse().unwrap();
let end_line_number: usize = split_search_field.get(3).unwrap().parse().unwrap();
let output_second = get_unique_files_changed(
origin_file_path,
start_line_number,
end_line_number,
db_obj,
);
return output + &output_second;
} else {
let start_line_number: usize = split_search_field.first().unwrap().parse().unwrap();
let end_line_number: usize = split_search_field.get(1).unwrap().parse().unwrap();
return get_unique_files_changed(
origin_file_path,
start_line_number,
end_line_number,
db_obj,
false,
);
}
} else {
return res;
final_result
}
}
let output = extract_details(start_line_number, end_line_number, origin_file_path);
}

pub fn perform_for_single_line(
start_line_number: usize,
end_line_number: usize,
origin_file_path: String,
db_obj: &mut DB,
is_author_mode: bool,
) -> String {
let output = extract_details(start_line_number, end_line_number, origin_file_path.clone());
// println!(
// "Only computing for {:?} -> {:?}",
// start_line_number, end_line_number
// );
let mut res: HashMap<String, usize> = HashMap::new();
db_obj.append(
&origin_file_path,
start_line_number,
end_line_number,
output.clone(),
);
for single_struct in output {
db_obj.append(
&configured_file_path,
start_line_number,
end_line_number,
single_struct.clone(),
);
for each_file in single_struct.contextual_file_paths {
if res.contains_key(&each_file) {
let count = res.get(&each_file).unwrap() + 1;
res.insert(each_file, count);
if is_author_mode {
if res.contains_key(&single_struct.author_full_name) {
let count = res.get(&single_struct.author_full_name).unwrap() + 1;
res.insert(single_struct.author_full_name, count);
continue;
}
res.insert(each_file, 0);
res.insert(single_struct.author_full_name, 0);
} else {
for each_file in single_struct.contextual_file_paths {
if res.contains_key(&each_file) {
let count = res.get(&each_file).unwrap() + 1;
res.insert(each_file, count);
continue;
}
res.insert(each_file, 0);
}
}
}
db_obj.store();
Expand All @@ -94,88 +111,60 @@ pub fn get_unique_files_changed(
}

pub fn get_contextual_authors(
file_path: String,
start_line_number: usize,
end_line_number: usize,
origin_file_path: String,
start_line_number: &usize,
end_line_number: &usize,
db_obj: &mut DB,
) -> String {
let configured_file_path: String = file_path.clone();
let line_str: String = format!("{start_line_number}_{end_line_number}");
// Check in the DB first
let mut res = String::new();
let mut visited: HashMap<String, usize> = HashMap::new();
if let (Some(obj), search_field_second) = db_obj.exists(&configured_file_path, &line_str) {
// means nothing to do...
for author_detail in obj {
if visited.contains_key(&author_detail.author_full_name) {
continue;
let (existing_result_optional, unvisited_indices) =
db_obj.exists_and_return(&origin_file_path, start_line_number, end_line_number);
match existing_result_optional {
Some(existing_result) => {
for author_detail in existing_result {
if visited.contains_key(&author_detail.author_full_name) {
continue;
}
if author_detail.author_full_name.contains("Not Committed Yet") {
continue;
}
visited.insert(author_detail.author_full_name.clone(), 1);
res.push_str(&author_detail.author_full_name);
res.push(',');
}
if author_detail.author_full_name.contains("Not Committed Yet") {
continue;
if res.ends_with(',') {
res.pop();
}
visited.insert(author_detail.author_full_name.clone(), 1);
res.push_str(&author_detail.author_full_name);
res.push(',');
}
if res.ends_with(',') {
res.pop();
if !unvisited_indices.is_empty() {
// find if multiple splits are there
let mut res_string: String = res;
for each_unvisited_index in unvisited_indices {
res_string += &perform_for_single_line(
each_unvisited_index,
each_unvisited_index,
origin_file_path.clone(),
db_obj,
true,
);
}
return res_string;
}
res
}
if !search_field_second.is_empty() {
// find if multiple splits are there
let split_search_field: Vec<&str> = search_field_second.split('_').collect();
if split_search_field.len() == 4 {
let start_line_number: usize = split_search_field.first().unwrap().parse().unwrap();
let end_line_number: usize = split_search_field.get(1).unwrap().parse().unwrap();
let output = get_contextual_authors(
file_path.clone(),
start_line_number,
end_line_number,
db_obj,
);
let start_line_number: usize = split_search_field.get(2).unwrap().parse().unwrap();
let end_line_number: usize = split_search_field.get(3).unwrap().parse().unwrap();
let output_second =
get_contextual_authors(file_path, start_line_number, end_line_number, db_obj);
return output + &output_second;
} else {
let start_line_number: usize = split_search_field.first().unwrap().parse().unwrap();
let end_line_number: usize = split_search_field.get(1).unwrap().parse().unwrap();
return get_contextual_authors(
file_path,
start_line_number,
end_line_number,
None => {
let mut final_result = "".to_string();
for each_unvisited_index in unvisited_indices {
final_result += &perform_for_single_line(
each_unvisited_index,
each_unvisited_index,
origin_file_path.clone(),
db_obj,
true,
);
}
} else {
return res;
final_result
}
}
let output = extract_details(start_line_number, end_line_number, file_path);
let mut res: HashMap<String, usize> = HashMap::new();
for single_struct in output {
db_obj.append(
&configured_file_path,
start_line_number,
end_line_number,
single_struct.clone(),
);
let author_full_name = single_struct.author_full_name;
if res.contains_key(&author_full_name) {
let count = res.get(&author_full_name).unwrap() + 1;
res.insert(author_full_name, count);
continue;
}
res.insert(author_full_name, 0);
}
db_obj.store();
let mut res_string: String = String::new();
for key in res.keys() {
res_string.push_str(key.as_str());
res_string.push(',');
}
if res_string.ends_with(',') {
res_string.pop();
}
res_string
}

0 comments on commit b639749

Please sign in to comment.