[ 
https://issues.apache.org/jira/browse/CSV-321?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=18082302#comment-18082302
 ] 

Ruiqi Dong commented on CSV-321:
--------------------------------

Hi [~ggregory]

Thanks for your efforts! I've verified the fix and will close the ticket 
accordingly.

> CSVFormat.equals()/hashCode() ignores maxRows
> ---------------------------------------------
>
>                 Key: CSV-321
>                 URL: https://issues.apache.org/jira/browse/CSV-321
>             Project: Commons CSV
>          Issue Type: Bug
>    Affects Versions: 1.14.1
>            Reporter: Ruiqi Dong
>            Assignee: Gary D. Gregory
>            Priority: Minor
>             Fix For: 1.14.2
>
>   Original Estimate: 0.5h
>  Remaining Estimate: 0.5h
>
> *Summary*
> CSVFormat has a maxRows configuration field, but equals() and hashCode() both 
> ignore it. Two format objects with different row limits can therefore compare 
> equal.
>  
> *Affected code*
> File: src/main/java/org/apache/commons/csv/CSVFormat.java
> {code:java}
> /** The maximum number of rows to process, excluding the header row. */
> private long maxRows;
> public Builder setMaxRows(final long maxRows) {
>     this.maxRows = maxRows;
>     return this;
> }
> private final long maxRows;
> return allowMissingColumnNames == other.allowMissingColumnNames
>         && ...
>         && trailingData == other.trailingData
>         && trailingDelimiter == other.trailingDelimiter
>         && trim == other.trim;
> @Override
> public int hashCode() {
>     return prime * result + Objects.hash(
>             allowMissingColumnNames, autoFlush, commentMarker, delimiter,
>             duplicateHeaderMode, escapeCharacter, ignoreEmptyLines,
>             ignoreHeaderCase, ignoreSurroundingSpaces, lenientEof,
>             nullString, quoteCharacter, quoteMode, quotedNullString,
>             recordSeparator, skipHeaderRecord, trailingData,
>             trailingDelimiter, trim);
> }{code}
>  
> *Reproducer*
> Add the following test to 
> src/test/java/org/apache/commons/csv/CSVFormatTest.java:
> {code:java}
> @Test
> void testEqualsMaxRows() {
>     final CSVFormat right = CSVFormat.DEFAULT.builder().setMaxRows(10).get();
>     final CSVFormat left = CSVFormat.DEFAULT.builder().setMaxRows(1000).get();
>     assertNotEqualsFlip(right, left);
>     assertNotEquals(right.hashCode(), left.hashCode());
> } {code}
> Run:
> {code:java}
> mvn -q -Dtest=org.apache.commons.csv.CSVFormatTest test {code}
> Observed behavior:
> {code:java}
> CSVFormatTest.testEqualsMaxRows:256
> expected: not equal but was: <Delimiter=<,> QuoteChar=<"> 
> RecordSeparator=<\r\n> EmptyLines:ignored SkipHeaderRecord:false> {code}
> Expected behavior:
> Objects with different {{maxRows}} values should not compare equal.
>  
> {{maxRows}} changes the format's observable behavior by limiting how many 
> records are processed. It should therefore participate in equality and 
> hashing.
>  
>  



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to