From b3d7e571c982532ed44a9e04a8edcf5543203994 Mon Sep 17 00:00:00 2001 From: David Randolph Phillips Date: Mon, 16 Oct 2023 14:30:47 -0400 Subject: [PATCH 1/8] [BI-1914]Created default sorts --- .../brapi/v2/services/BrAPITrialService.java | 23 ++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/breedinginsight/brapi/v2/services/BrAPITrialService.java b/src/main/java/org/breedinginsight/brapi/v2/services/BrAPITrialService.java index b90f7ef8e..2aac1bda7 100644 --- a/src/main/java/org/breedinginsight/brapi/v2/services/BrAPITrialService.java +++ b/src/main/java/org/breedinginsight/brapi/v2/services/BrAPITrialService.java @@ -11,6 +11,7 @@ import org.brapi.v2.model.core.*; import org.brapi.v2.model.core.response.BrAPIListsSingleResponse; import org.brapi.v2.model.germ.BrAPIGermplasm; + import org.brapi.v2.model.pheno.*; import org.breedinginsight.brapi.v2.constants.BrAPIAdditionalInfoFields; import org.breedinginsight.brapi.v2.dao.BrAPIGermplasmDAO; @@ -18,6 +19,7 @@ import org.breedinginsight.brapps.importer.daos.*; import org.breedinginsight.brapps.importer.model.exports.FileType; import org.breedinginsight.brapps.importer.model.imports.experimentObservation.ExperimentObservation; +import org.breedinginsight.brapps.importer.model.imports.experimentObservation.ExperimentObservation.Columns; import org.breedinginsight.brapps.importer.services.ExternalReferenceSource; import org.breedinginsight.brapps.importer.services.FileMappingUtil; import org.breedinginsight.model.BrAPIConstants; @@ -235,7 +237,11 @@ public DownloadFile exportObservations( List files = new ArrayList<>(); // Generate a file for each study. for (Map.Entry>> entry: rowsByStudyId.entrySet()) { - StreamedFile streamedFile = writeToStreamedFile(columns, entry.getValue(), fileType, "Experiment Data"); + + List> rows = entry.getValue(); + sortExportRows(rows); + //TODO the sheetName should be "Data". It should no longer be "Experiment Data" + StreamedFile streamedFile = writeToStreamedFile(columns, rows, fileType, "Experiment Data"); String name = makeFileName(experiment, program, studyByDbId.get(entry.getKey()).getStudyName()) + fileType.getExtension(); // Add to file list. files.add(new DownloadFile(name, streamedFile)); @@ -252,7 +258,9 @@ public DownloadFile exportObservations( } } else { List> exportRows = new ArrayList<>(rowByOUId.values()); + sortExportRows(exportRows); // write export data to requested file format + //TODO the sheetName should be "Data". It should no longer be "Experiment Data" StreamedFile streamedFile = writeToStreamedFile(columns, exportRows, fileType, "Experiment Data"); // Set filename. String envFilenameFragment = params.getEnvironments() == null ? "All Environments" : params.getEnvironments(); @@ -308,6 +316,7 @@ public Dataset getDatasetData(Program program, UUID experimentId, UUID datsetId, log.debug("fetching observations for dataset: " + datsetId); List data = observationDAO.getObservationsByObservationUnitsAndVariables(ouDbIds, obsVarDbIds, program); log.debug("building dataset object for dataset: " + datsetId); + sortObservationUnit(datasetOUs); Dataset dataset = new Dataset(experimentId.toString(), data, datasetOUs, datasetObsVars); if (stats) { Integer ouCount = datasetOUs.size(); @@ -549,4 +558,16 @@ private List filterDatasetByEnvironment( .collect(Collectors.toList()); } + private void sortObservationUnit(List ous){ + ous.sort(Comparator.comparing(BrAPIObservationUnit::getStudyName) + .thenComparing(BrAPIObservationUnit::getObservationUnitName)); + } + + private void sortExportRows(List> exportRows){ + Comparator> envComparator = Comparator.comparing(row -> ( row.get(Columns.ENV).toString())); + Comparator> expUnitIdComparator = + Comparator.comparing(row -> (row.get(Columns.EXP_UNIT_ID).toString())); + + exportRows.sort(envComparator.thenComparing(expUnitIdComparator)); + } } \ No newline at end of file From 60e4ed3fe54bff49bf44f966335957c8f1032912 Mon Sep 17 00:00:00 2001 From: David Randolph Phillips Date: Mon, 16 Oct 2023 14:34:44 -0400 Subject: [PATCH 2/8] [BI-1914] Spread sheet's sheet Name should be 'Data' not 'Experiment Data' --- .../brapi/v2/services/BrAPITrialService.java | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/breedinginsight/brapi/v2/services/BrAPITrialService.java b/src/main/java/org/breedinginsight/brapi/v2/services/BrAPITrialService.java index 2aac1bda7..020654985 100644 --- a/src/main/java/org/breedinginsight/brapi/v2/services/BrAPITrialService.java +++ b/src/main/java/org/breedinginsight/brapi/v2/services/BrAPITrialService.java @@ -229,7 +229,7 @@ public DownloadFile exportObservations( // Initialize key with empty list if it is not present. if (!rowsByStudyId.containsKey(studyId)) { - rowsByStudyId.put(studyId, new ArrayList>()); + rowsByStudyId.put(studyId, new ArrayList<>()); } // Add row to appropriate list in rowsByStudyId. rowsByStudyId.get(studyId).add(row); @@ -240,8 +240,7 @@ public DownloadFile exportObservations( List> rows = entry.getValue(); sortExportRows(rows); - //TODO the sheetName should be "Data". It should no longer be "Experiment Data" - StreamedFile streamedFile = writeToStreamedFile(columns, rows, fileType, "Experiment Data"); + StreamedFile streamedFile = writeToStreamedFile(columns, rows, fileType, "Data"); String name = makeFileName(experiment, program, studyByDbId.get(entry.getKey()).getStudyName()) + fileType.getExtension(); // Add to file list. files.add(new DownloadFile(name, streamedFile)); @@ -260,8 +259,7 @@ public DownloadFile exportObservations( List> exportRows = new ArrayList<>(rowByOUId.values()); sortExportRows(exportRows); // write export data to requested file format - //TODO the sheetName should be "Data". It should no longer be "Experiment Data" - StreamedFile streamedFile = writeToStreamedFile(columns, exportRows, fileType, "Experiment Data"); + StreamedFile streamedFile = writeToStreamedFile(columns, exportRows, fileType, "Data"); // Set filename. String envFilenameFragment = params.getEnvironments() == null ? "All Environments" : params.getEnvironments(); String fileName = makeFileName(experiment, program, envFilenameFragment) + fileType.getExtension(); From d5c4ad7b81a86e93b7af803abfb62cd989d82ed9 Mon Sep 17 00:00:00 2001 From: David Randolph Phillips Date: Mon, 16 Oct 2023 15:09:50 -0400 Subject: [PATCH 3/8] [BI-1914] tightened up code --- .../brapi/v2/services/BrAPITrialService.java | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/src/main/java/org/breedinginsight/brapi/v2/services/BrAPITrialService.java b/src/main/java/org/breedinginsight/brapi/v2/services/BrAPITrialService.java index 020654985..3f5036911 100644 --- a/src/main/java/org/breedinginsight/brapi/v2/services/BrAPITrialService.java +++ b/src/main/java/org/breedinginsight/brapi/v2/services/BrAPITrialService.java @@ -32,6 +32,7 @@ import org.breedinginsight.services.writers.CSVWriter; import org.breedinginsight.services.writers.ExcelWriter; import org.breedinginsight.utilities.Utilities; +import org.jetbrains.annotations.NotNull; import javax.inject.Inject; import javax.inject.Singleton; @@ -59,6 +60,7 @@ public class BrAPITrialService { private final BrAPIObservationUnitDAO ouDAO; private final BrAPIGermplasmDAO germplasmDAO; private final FileMappingUtil fileMappingUtil; + private static final String SHEET_NAME = "Data"; @Inject public BrAPITrialService(@Property(name = "brapi.server.reference-source") String referenceSource, @@ -237,10 +239,9 @@ public DownloadFile exportObservations( List files = new ArrayList<>(); // Generate a file for each study. for (Map.Entry>> entry: rowsByStudyId.entrySet()) { - List> rows = entry.getValue(); - sortExportRows(rows); - StreamedFile streamedFile = writeToStreamedFile(columns, rows, fileType, "Data"); + sortDefaultForExportRows(rows); + StreamedFile streamedFile = writeToStreamedFile(columns, rows, fileType, SHEET_NAME); String name = makeFileName(experiment, program, studyByDbId.get(entry.getKey()).getStudyName()) + fileType.getExtension(); // Add to file list. files.add(new DownloadFile(name, streamedFile)); @@ -257,9 +258,9 @@ public DownloadFile exportObservations( } } else { List> exportRows = new ArrayList<>(rowByOUId.values()); - sortExportRows(exportRows); + sortDefaultForExportRows(exportRows); // write export data to requested file format - StreamedFile streamedFile = writeToStreamedFile(columns, exportRows, fileType, "Data"); + StreamedFile streamedFile = writeToStreamedFile(columns, exportRows, fileType, SHEET_NAME); // Set filename. String envFilenameFragment = params.getEnvironments() == null ? "All Environments" : params.getEnvironments(); String fileName = makeFileName(experiment, program, envFilenameFragment) + fileType.getExtension(); @@ -314,7 +315,7 @@ public Dataset getDatasetData(Program program, UUID experimentId, UUID datsetId, log.debug("fetching observations for dataset: " + datsetId); List data = observationDAO.getObservationsByObservationUnitsAndVariables(ouDbIds, obsVarDbIds, program); log.debug("building dataset object for dataset: " + datsetId); - sortObservationUnit(datasetOUs); + sortDefaultForObservationUnit(datasetOUs); Dataset dataset = new Dataset(experimentId.toString(), data, datasetOUs, datasetObsVars); if (stats) { Integer ouCount = datasetOUs.size(); @@ -556,13 +557,13 @@ private List filterDatasetByEnvironment( .collect(Collectors.toList()); } - private void sortObservationUnit(List ous){ + private void sortDefaultForObservationUnit(List ous) { ous.sort(Comparator.comparing(BrAPIObservationUnit::getStudyName) .thenComparing(BrAPIObservationUnit::getObservationUnitName)); } - private void sortExportRows(List> exportRows){ - Comparator> envComparator = Comparator.comparing(row -> ( row.get(Columns.ENV).toString())); + private void sortDefaultForExportRows(@NotNull List> exportRows) { + Comparator> envComparator = Comparator.comparing(row -> (row.get(Columns.ENV).toString())); Comparator> expUnitIdComparator = Comparator.comparing(row -> (row.get(Columns.EXP_UNIT_ID).toString())); From 92e1ad2e8b044ef6124049495ee667776c289fcf Mon Sep 17 00:00:00 2001 From: David Randolph Phillips Date: Thu, 2 Nov 2023 11:22:37 -0400 Subject: [PATCH 4/8] [BI-1914]WIP --- .../brapi/v2/services/BrAPITrialService.java | 50 +++++++++++--- .../utilities/IntOrderComparator.java | 67 +++++++++++++++++++ 2 files changed, 109 insertions(+), 8 deletions(-) create mode 100644 src/main/java/org/breedinginsight/utilities/IntOrderComparator.java diff --git a/src/main/java/org/breedinginsight/brapi/v2/services/BrAPITrialService.java b/src/main/java/org/breedinginsight/brapi/v2/services/BrAPITrialService.java index 3f5036911..1bc1af3b6 100644 --- a/src/main/java/org/breedinginsight/brapi/v2/services/BrAPITrialService.java +++ b/src/main/java/org/breedinginsight/brapi/v2/services/BrAPITrialService.java @@ -31,6 +31,7 @@ import org.breedinginsight.services.parsers.experiment.ExperimentFileColumns; import org.breedinginsight.services.writers.CSVWriter; import org.breedinginsight.services.writers.ExcelWriter; +import org.breedinginsight.utilities.IntOrderComparator; import org.breedinginsight.utilities.Utilities; import org.jetbrains.annotations.NotNull; @@ -43,6 +44,8 @@ import java.time.format.DateTimeFormatter; import java.util.*; import java.util.function.Function; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import java.util.stream.Collectors; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; @@ -557,16 +560,47 @@ private List filterDatasetByEnvironment( .collect(Collectors.toList()); } + static Comparator alphaNumComparator = (str1, str2) -> { + Pattern p = Pattern.compile("^\\d+"); + Matcher m = p.matcher(str1); + Integer number1 = null; + if (!m.find()) { + return str1.compareToIgnoreCase(str2); + } + else { + Integer number2 = null; + number1 = Integer.parseInt(m.group()); + m = p.matcher(str2); + if (!m.find()) { + return str1.compareToIgnoreCase(str2); + } + else { + number2 = Integer.parseInt(m.group()); + int comparison = number1.compareTo(number2); + if (comparison != 0) { + return comparison; + } + else { + return str1.compareToIgnoreCase(str2); + } + } + } + }; + private void sortDefaultForObservationUnit(List ous) { - ous.sort(Comparator.comparing(BrAPIObservationUnit::getStudyName) - .thenComparing(BrAPIObservationUnit::getObservationUnitName)); + Comparator studyNameComparator = Comparator.comparing(BrAPIObservationUnit::getStudyName, new IntOrderComparator()); + Comparator ouNameComparator = Comparator.comparing(BrAPIObservationUnit::getObservationUnitName, new IntOrderComparator()); + ous.sort( (studyNameComparator).thenComparing(ouNameComparator)); } private void sortDefaultForExportRows(@NotNull List> exportRows) { - Comparator> envComparator = Comparator.comparing(row -> (row.get(Columns.ENV).toString())); - Comparator> expUnitIdComparator = - Comparator.comparing(row -> (row.get(Columns.EXP_UNIT_ID).toString())); - - exportRows.sort(envComparator.thenComparing(expUnitIdComparator)); +// Comparator> envComparator = Comparator.comparing(row -> (row.get(Columns.ENV).toString())); +// Comparator> expUnitIdComparator = +// Comparator.comparing(row -> (row.get(Columns.EXP_UNIT_ID).toString())); +// +// exportRows.sort(envComparator.thenComparing(expUnitIdComparator)); +// + exportRows.sort( (row1, row2) -> alphaNumComparator.compare((row1.get(Columns.EXP_UNIT_ID).toString()), (row2.get(Columns.EXP_UNIT_ID).toString()))); + exportRows.sort( (row1, row2) -> alphaNumComparator.compare((row1.get(Columns.ENV).toString()), (row2.get(Columns.ENV).toString()))); } -} \ No newline at end of file +} diff --git a/src/main/java/org/breedinginsight/utilities/IntOrderComparator.java b/src/main/java/org/breedinginsight/utilities/IntOrderComparator.java new file mode 100644 index 000000000..5614c4c77 --- /dev/null +++ b/src/main/java/org/breedinginsight/utilities/IntOrderComparator.java @@ -0,0 +1,67 @@ +package org.breedinginsight.utilities; + +import java.util.Comparator; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +/* +If you have text(optional), followed by some digits, followed by more text(optional), this Comparator +will sort the digits in numeric order. The text (and any subsequent digits) will be in alpha-numeric order. +*/ +public class IntOrderComparator implements Comparator { + @Override + public int compare(String str1, String str2) { + //static finals to make the Matcher::group code more readable + final int PREFIX = 1; + final int NUMBERS = 2; + final int SUFFIX = 3; + + // convert null strings to blank + str1 = (str1 == null) ? "" : str1; + str2 = (str2 == null) ? "" : str2; + + //The real work begins + + // NOTE: The last group includes all remaining text and digits + Pattern p = Pattern.compile("^([^\\d]*)(\\d*)(.*)$"); + + Matcher m1 = p.matcher(str1); + Matcher m2 = p.matcher(str2); + m1.find(); // needed to let m1.group() work + m2.find(); // needed to let m2.group() work + + String prefix1 = m1.group(PREFIX); + String prefix2 = m2.group(PREFIX); + Integer number1 = m1.group(NUMBERS).length() > 0 ? Integer.parseInt(m1.group(NUMBERS)) : null; + Integer number2 = m2.group(NUMBERS).length() > 0 ? Integer.parseInt(m2.group(NUMBERS)) : null; + String suffix1 = m1.group(SUFFIX); + String suffix2 = m2.group(SUFFIX); + + if (!prefix1.equals(prefix2)) { + return prefix1.compareTo(prefix2); + } + /*if the prefixes are equal, sort by numbers and suffixes.*/ + + // an empty number goes before a number (EX. 'a' before 'a1') + if (number1 == null && number2 != null) { + return -1; + } + if (number1 != null && number2 == null) { + return 1; + } + if (number1 == null && number2 == null) { + return 0; + } + + if (!number1.equals(number2)) { + return number1.compareTo(number2); + } + /*if the prefixes and numbers are equal, sort by suffixes.*/ + if (!suffix1.equals(suffix2)) { + return suffix1.compareTo(suffix2); + } + + /* if all else fails, compare the strings + (I think this will always return 0)*/ + return str1.compareTo(str2); + } +} From d7cba83e9866ecf713f265472081fccc3380d091 Mon Sep 17 00:00:00 2001 From: David Randolph Phillips Date: Thu, 2 Nov 2023 11:53:16 -0400 Subject: [PATCH 5/8] [BI-1914] Use IntOrderComparator --- .../brapi/v2/services/BrAPITrialService.java | 42 +++---------------- 1 file changed, 6 insertions(+), 36 deletions(-) diff --git a/src/main/java/org/breedinginsight/brapi/v2/services/BrAPITrialService.java b/src/main/java/org/breedinginsight/brapi/v2/services/BrAPITrialService.java index 1bc1af3b6..7935f5be6 100644 --- a/src/main/java/org/breedinginsight/brapi/v2/services/BrAPITrialService.java +++ b/src/main/java/org/breedinginsight/brapi/v2/services/BrAPITrialService.java @@ -560,33 +560,6 @@ private List filterDatasetByEnvironment( .collect(Collectors.toList()); } - static Comparator alphaNumComparator = (str1, str2) -> { - Pattern p = Pattern.compile("^\\d+"); - Matcher m = p.matcher(str1); - Integer number1 = null; - if (!m.find()) { - return str1.compareToIgnoreCase(str2); - } - else { - Integer number2 = null; - number1 = Integer.parseInt(m.group()); - m = p.matcher(str2); - if (!m.find()) { - return str1.compareToIgnoreCase(str2); - } - else { - number2 = Integer.parseInt(m.group()); - int comparison = number1.compareTo(number2); - if (comparison != 0) { - return comparison; - } - else { - return str1.compareToIgnoreCase(str2); - } - } - } - }; - private void sortDefaultForObservationUnit(List ous) { Comparator studyNameComparator = Comparator.comparing(BrAPIObservationUnit::getStudyName, new IntOrderComparator()); Comparator ouNameComparator = Comparator.comparing(BrAPIObservationUnit::getObservationUnitName, new IntOrderComparator()); @@ -594,13 +567,10 @@ private void sortDefaultForObservationUnit(List ous) { } private void sortDefaultForExportRows(@NotNull List> exportRows) { -// Comparator> envComparator = Comparator.comparing(row -> (row.get(Columns.ENV).toString())); -// Comparator> expUnitIdComparator = -// Comparator.comparing(row -> (row.get(Columns.EXP_UNIT_ID).toString())); -// -// exportRows.sort(envComparator.thenComparing(expUnitIdComparator)); -// - exportRows.sort( (row1, row2) -> alphaNumComparator.compare((row1.get(Columns.EXP_UNIT_ID).toString()), (row2.get(Columns.EXP_UNIT_ID).toString()))); - exportRows.sort( (row1, row2) -> alphaNumComparator.compare((row1.get(Columns.ENV).toString()), (row2.get(Columns.ENV).toString()))); - } + Comparator> envComparator = Comparator.comparing(row -> (row.get(Columns.ENV).toString()), new IntOrderComparator()); + Comparator> expUnitIdComparator = + Comparator.comparing(row -> (row.get(Columns.EXP_UNIT_ID).toString()), new IntOrderComparator()); + + exportRows.sort(envComparator.thenComparing(expUnitIdComparator)); + } } From 5fd64cf2262b87a354a63f1f3d29cc022cb4f53d Mon Sep 17 00:00:00 2001 From: David Randolph Phillips Date: Thu, 2 Nov 2023 11:54:23 -0400 Subject: [PATCH 6/8] [BI-1914] removed unused import statement --- .../breedinginsight/brapi/v2/services/BrAPITrialService.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/org/breedinginsight/brapi/v2/services/BrAPITrialService.java b/src/main/java/org/breedinginsight/brapi/v2/services/BrAPITrialService.java index 7935f5be6..9847b762d 100644 --- a/src/main/java/org/breedinginsight/brapi/v2/services/BrAPITrialService.java +++ b/src/main/java/org/breedinginsight/brapi/v2/services/BrAPITrialService.java @@ -44,8 +44,6 @@ import java.time.format.DateTimeFormatter; import java.util.*; import java.util.function.Function; -import java.util.regex.Matcher; -import java.util.regex.Pattern; import java.util.stream.Collectors; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; From 4b28150a843b98536d256c9887a6b1c810edd7d6 Mon Sep 17 00:00:00 2001 From: David Randolph Phillips Date: Thu, 2 Nov 2023 16:01:58 -0400 Subject: [PATCH 7/8] [BI-1914] improved language in IntOrderComparator --- .../utilities/IntOrderComparator.java | 42 +++++++++++++------ 1 file changed, 29 insertions(+), 13 deletions(-) diff --git a/src/main/java/org/breedinginsight/utilities/IntOrderComparator.java b/src/main/java/org/breedinginsight/utilities/IntOrderComparator.java index 5614c4c77..cb01ff5d9 100644 --- a/src/main/java/org/breedinginsight/utilities/IntOrderComparator.java +++ b/src/main/java/org/breedinginsight/utilities/IntOrderComparator.java @@ -4,15 +4,28 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; /* -If you have text(optional), followed by some digits, followed by more text(optional), this Comparator -will sort the digits in numeric order. The text (and any subsequent digits) will be in alpha-numeric order. +If you have text(optional), followed by some digits(optional), followed by more text(optional), this Comparator +will sort the digits in numeric order. The trailing text (and any subsequent digits) will be in +alpha-numeric order. + +In other words; this comparator will assume that strings being compared are comprised of a text _prefix_, and an +_integer_, followed by a _suffix_. + +This comparator will fist compare the prefix as an alpha-numeric, the integer as numeric and +then the the suffix as an alpha-numeric. +For Example: +1) if a string is 'big4team', then prefix='big', integer=4, suffix='team' +2) if a string is '12monkeys', then prefix='', integer=12, suffix='monkeys' +3) if a string is 'abcd', then prefix='abcd', integer=null, suffix='' +4) if a string is 'libnum14.3', then prefix='libnum', integer=14, suffix='.4' + */ public class IntOrderComparator implements Comparator { @Override public int compare(String str1, String str2) { //static finals to make the Matcher::group code more readable final int PREFIX = 1; - final int NUMBERS = 2; + final int INTEGER = 2; final int SUFFIX = 3; // convert null strings to blank @@ -26,36 +39,37 @@ public int compare(String str1, String str2) { Matcher m1 = p.matcher(str1); Matcher m2 = p.matcher(str2); + m1.find(); // needed to let m1.group() work m2.find(); // needed to let m2.group() work String prefix1 = m1.group(PREFIX); String prefix2 = m2.group(PREFIX); - Integer number1 = m1.group(NUMBERS).length() > 0 ? Integer.parseInt(m1.group(NUMBERS)) : null; - Integer number2 = m2.group(NUMBERS).length() > 0 ? Integer.parseInt(m2.group(NUMBERS)) : null; + Integer integer1 = m1.group(INTEGER).length() > 0 ? Integer.parseInt(m1.group(INTEGER)) : null; + Integer integer2 = m2.group(INTEGER).length() > 0 ? Integer.parseInt(m2.group(INTEGER)) : null; String suffix1 = m1.group(SUFFIX); String suffix2 = m2.group(SUFFIX); if (!prefix1.equals(prefix2)) { return prefix1.compareTo(prefix2); } - /*if the prefixes are equal, sort by numbers and suffixes.*/ + /*if the prefixes are equal, sort by integers and suffixes.*/ - // an empty number goes before a number (EX. 'a' before 'a1') - if (number1 == null && number2 != null) { + // an empty integer goes before an integer (EX. 'a' before 'a1') + if (integer1 == null && integer2 != null) { return -1; } - if (number1 != null && number2 == null) { + if (integer1 != null && integer2 == null) { return 1; } - if (number1 == null && number2 == null) { + if (integer1 == null && integer2 == null) { return 0; } - if (!number1.equals(number2)) { - return number1.compareTo(number2); + if (!integer1.equals(integer2)) { + return integer1.compareTo(integer2); } - /*if the prefixes and numbers are equal, sort by suffixes.*/ + /*if the prefixes and integers are equal, sort by suffixes.*/ if (!suffix1.equals(suffix2)) { return suffix1.compareTo(suffix2); } @@ -65,3 +79,5 @@ public int compare(String str1, String str2) { return str1.compareTo(str2); } } + + From 921fd0856e1d627fe144c88d99816617337820ba Mon Sep 17 00:00:00 2001 From: David Randolph Phillips Date: Tue, 7 Nov 2023 12:18:06 -0500 Subject: [PATCH 8/8] [BI-1914] changed Integer to BigInteger Changed the wording from 'integers' to 'digits' --- .../utilities/IntOrderComparator.java | 51 ++++++++++--------- 1 file changed, 26 insertions(+), 25 deletions(-) diff --git a/src/main/java/org/breedinginsight/utilities/IntOrderComparator.java b/src/main/java/org/breedinginsight/utilities/IntOrderComparator.java index cb01ff5d9..bbd1ca813 100644 --- a/src/main/java/org/breedinginsight/utilities/IntOrderComparator.java +++ b/src/main/java/org/breedinginsight/utilities/IntOrderComparator.java @@ -1,5 +1,6 @@ package org.breedinginsight.utilities; +import java.math.BigInteger; import java.util.Comparator; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -8,24 +9,23 @@ If you have text(optional), followed by some digits(optional), followed by more will sort the digits in numeric order. The trailing text (and any subsequent digits) will be in alpha-numeric order. -In other words; this comparator will assume that strings being compared are comprised of a text _prefix_, and an -_integer_, followed by a _suffix_. +In other words; this comparator will assume that strings being compared are comprised of a text _prefix_, followed by +_digits_, followed by a _suffix_. -This comparator will fist compare the prefix as an alpha-numeric, the integer as numeric and +This comparator will fist compare the prefix as an alpha-numeric, the digits as a numeric and then the the suffix as an alpha-numeric. For Example: -1) if a string is 'big4team', then prefix='big', integer=4, suffix='team' -2) if a string is '12monkeys', then prefix='', integer=12, suffix='monkeys' -3) if a string is 'abcd', then prefix='abcd', integer=null, suffix='' -4) if a string is 'libnum14.3', then prefix='libnum', integer=14, suffix='.4' - +1) if a string is 'big4team', then prefix='big', digits=4, suffix='team' +2) if a string is '12monkeys', then prefix='', digits=12, suffix='monkeys' +3) if a string is 'abcd', then prefix='abcd', digits=null, suffix='' +4) if a string is 'libnum14.3', then prefix='libnum', digits=14, suffix='.4' */ public class IntOrderComparator implements Comparator { @Override public int compare(String str1, String str2) { //static finals to make the Matcher::group code more readable final int PREFIX = 1; - final int INTEGER = 2; + final int DIGITS = 2; final int SUFFIX = 3; // convert null strings to blank @@ -45,31 +45,32 @@ public int compare(String str1, String str2) { String prefix1 = m1.group(PREFIX); String prefix2 = m2.group(PREFIX); - Integer integer1 = m1.group(INTEGER).length() > 0 ? Integer.parseInt(m1.group(INTEGER)) : null; - Integer integer2 = m2.group(INTEGER).length() > 0 ? Integer.parseInt(m2.group(INTEGER)) : null; + BigInteger digits1 = m1.group(DIGITS).length() > 0 ? new BigInteger(m1.group(DIGITS)) : null; + BigInteger digits2 = m2.group(DIGITS).length() > 0 ? new BigInteger(m2.group(DIGITS)) : null; String suffix1 = m1.group(SUFFIX); String suffix2 = m2.group(SUFFIX); if (!prefix1.equals(prefix2)) { return prefix1.compareTo(prefix2); } - /*if the prefixes are equal, sort by integers and suffixes.*/ - - // an empty integer goes before an integer (EX. 'a' before 'a1') - if (integer1 == null && integer2 != null) { - return -1; - } - if (integer1 != null && integer2 == null) { - return 1; + /*if the prefixes are equal, sort by digits and suffixes.*/ + + // an empty digit is less than any digit (EX. 'a' is less than 'a1') + if( digits1 == null){ + if(digits2 == null){ + return 0; //if both digits are null (equal) + } + else { + return -1; //if there are no digits in str1 but digits in str2 (str1 < str2) + } } - if (integer1 == null && integer2 == null) { - return 0; + if( digits2 == null){ + return 1; //if there are digits in str1 but no digits in str2 (str1 > str2) } - - if (!integer1.equals(integer2)) { - return integer1.compareTo(integer2); + if (!digits1.equals(digits2)) { + return digits1.compareTo(digits2); } - /*if the prefixes and integers are equal, sort by suffixes.*/ + /*if the prefixes and digits are equal, sort by suffixes.*/ if (!suffix1.equals(suffix2)) { return suffix1.compareTo(suffix2); }