Skip to content

Commit a355fc4

Browse files
committed
Create IsoDuration from Period and Duration
Driver represents duration as a custom `IsoDuration` interface. It's a combination of date-based amount and time-based amount. This commit makes driver accept `java.time.Period` and `java.time.Duration` as parameters and convert them to `IsoDuration`.
1 parent bb31fc0 commit a355fc4

File tree

4 files changed

+84
-0
lines changed

4 files changed

+84
-0
lines changed

driver/src/main/java/org/neo4j/driver/internal/InternalIsoDuration.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818
*/
1919
package org.neo4j.driver.internal;
2020

21+
import java.time.Duration;
22+
import java.time.Period;
2123
import java.time.temporal.Temporal;
2224
import java.time.temporal.TemporalUnit;
2325
import java.time.temporal.UnsupportedTemporalTypeException;
@@ -42,6 +44,16 @@ public class InternalIsoDuration implements IsoDuration
4244
private final long seconds;
4345
private final long nanoseconds;
4446

47+
public InternalIsoDuration( Period period )
48+
{
49+
this( period.toTotalMonths(), period.getDays(), 0, 0 );
50+
}
51+
52+
public InternalIsoDuration( Duration duration )
53+
{
54+
this( 0, 0, duration.getSeconds(), duration.getNano() );
55+
}
56+
4557
public InternalIsoDuration( long months, long days, long seconds, long nanoseconds )
4658
{
4759
this.months = months;

driver/src/main/java/org/neo4j/driver/v1/Values.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,12 @@
1818
*/
1919
package org.neo4j.driver.v1;
2020

21+
import java.time.Duration;
2122
import java.time.LocalDate;
2223
import java.time.LocalDateTime;
2324
import java.time.LocalTime;
2425
import java.time.OffsetTime;
26+
import java.time.Period;
2527
import java.time.ZonedDateTime;
2628
import java.util.ArrayList;
2729
import java.util.Arrays;
@@ -107,6 +109,8 @@ public static Value value( Object value )
107109
if ( value instanceof LocalDateTime ) { return value( (LocalDateTime) value ); }
108110
if ( value instanceof ZonedDateTime ) { return value( (ZonedDateTime) value ); }
109111
if ( value instanceof IsoDuration ) { return value( (IsoDuration) value ); }
112+
if ( value instanceof Period ) { return value( (Period) value ); }
113+
if ( value instanceof Duration ) { return value( (Duration) value ); }
110114
if ( value instanceof Point2D ) { return value( (Point2D) value ); }
111115
if ( value instanceof Point3D ) { return value( (Point3D) value ); }
112116

@@ -312,6 +316,16 @@ public static Value value( ZonedDateTime zonedDateTime )
312316
return new DateTimeValue( zonedDateTime );
313317
}
314318

319+
public static Value value( Period period )
320+
{
321+
return value( new InternalIsoDuration( period ) );
322+
}
323+
324+
public static Value value( Duration duration )
325+
{
326+
return value( new InternalIsoDuration( duration ) );
327+
}
328+
315329
public static Value isoDuration( long months, long days, long seconds, long nanoseconds )
316330
{
317331
return value( new InternalIsoDuration( months, days, seconds, nanoseconds ) );

driver/src/test/java/org/neo4j/driver/internal/InternalIsoDurationTest.java

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,9 @@
2020

2121
import org.junit.Test;
2222

23+
import java.time.Duration;
2324
import java.time.LocalDateTime;
25+
import java.time.Period;
2426
import java.time.temporal.Temporal;
2527
import java.time.temporal.UnsupportedTemporalTypeException;
2628

@@ -123,6 +125,32 @@ public void shouldImplementEqualsAndHashCode()
123125
assertEquals( duration1.hashCode(), duration2.hashCode() );
124126
}
125127

128+
@Test
129+
public void shouldCreateFromPeriod()
130+
{
131+
Period period = Period.of( 3, 5, 12 );
132+
133+
InternalIsoDuration duration = new InternalIsoDuration( period );
134+
135+
assertEquals( period.toTotalMonths(), duration.months() );
136+
assertEquals( period.getDays(), duration.days() );
137+
assertEquals( 0, duration.seconds() );
138+
assertEquals( 0, duration.nanoseconds() );
139+
}
140+
141+
@Test
142+
public void shouldCreateFromDuration()
143+
{
144+
Duration duration = Duration.ofSeconds( 391784, 4879173 );
145+
146+
InternalIsoDuration isoDuration = new InternalIsoDuration( duration );
147+
148+
assertEquals( 0, isoDuration.months() );
149+
assertEquals( 0, isoDuration.days() );
150+
assertEquals( duration.getSeconds(), isoDuration.seconds() );
151+
assertEquals( duration.getNano(), isoDuration.nanoseconds() );
152+
}
153+
126154
private static IsoDuration newDuration( long months, long days, long seconds, long nanoseconds )
127155
{
128156
return new InternalIsoDuration( months, days, seconds, nanoseconds );

driver/src/test/java/org/neo4j/driver/internal/ValuesTest.java

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,12 @@
2323
import org.junit.Test;
2424
import org.junit.rules.ExpectedException;
2525

26+
import java.time.Duration;
2627
import java.time.LocalDate;
2728
import java.time.LocalDateTime;
2829
import java.time.LocalTime;
2930
import java.time.OffsetTime;
31+
import java.time.Period;
3032
import java.time.ZonedDateTime;
3133
import java.util.ArrayDeque;
3234
import java.util.Collection;
@@ -432,6 +434,34 @@ public void shouldCreateValueFromIsoDuration()
432434
assertEquals( durationValue1, durationValue2 );
433435
}
434436

437+
@Test
438+
public void shouldCreateValueFromPeriod()
439+
{
440+
Period period = Period.of( 5, 11, 190 );
441+
442+
Value value = value( period );
443+
IsoDuration isoDuration = value.asIsoDuration();
444+
445+
assertEquals( period.toTotalMonths(), isoDuration.months() );
446+
assertEquals( period.getDays(), isoDuration.days() );
447+
assertEquals( 0, isoDuration.seconds() );
448+
assertEquals( 0, isoDuration.nanoseconds() );
449+
}
450+
451+
@Test
452+
public void shouldCreateValueFromDuration()
453+
{
454+
Duration duration = Duration.ofSeconds( 183951, 4384718937L );
455+
456+
Value value = value( duration );
457+
IsoDuration isoDuration = value.asIsoDuration();
458+
459+
assertEquals( 0, isoDuration.months() );
460+
assertEquals( 0, isoDuration.days() );
461+
assertEquals( duration.getSeconds(), isoDuration.seconds() );
462+
assertEquals( duration.getNano(), isoDuration.nanoseconds() );
463+
}
464+
435465
@Test
436466
public void shouldCreateValueFromPoint2D()
437467
{

0 commit comments

Comments
 (0)