Skip to content

Commit

Permalink
Fix NullPointerException and forbid assigning both datetime and epoch
Browse files Browse the repository at this point in the history
  • Loading branch information
sherfert authored and craigtaverner committed Mar 3, 2018
1 parent 49d707f commit cf32135
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 11 deletions.
Expand Up @@ -628,42 +628,49 @@ DateTimeBuilder assign( Field field, AnyValue value )
{ {
if ( field == Field.datetime || field == Field.epoch ) if ( field == Field.datetime || field == Field.epoch )
{ {
return new SelectDateTimeDTBuilder( date, time ); return new SelectDateTimeDTBuilder( date, time ).assign( field, value );
} }
else if ( field == Field.time || field == Field.date ) else if ( field == Field.time || field == Field.date )
{ {
return new SelectDateOrTimeDTBuilder( date, time ).assign( field, value ); return new SelectDateOrTimeDTBuilder( date, time ).assign( field, value );
} }
else else
{ {
return assignNonComposite( field, value ); return assignToSubBuilders( field, value );
} }
} }


DateTimeBuilder assignNonComposite( Field field, AnyValue value ) DateTimeBuilder assignToSubBuilders( Field field, AnyValue value )
{ {
if ( field.field.isDateBased() ) if ( field == Field.date || field.field != null && field.field.isDateBased() )
{ {
if ( date == null ) if ( date == null )
{ {
date = new ConstructDate(); date = new ConstructDate();
} }
date = date.assign( field, value ); date = date.assign( field, value );
} }
else else if ( field == Field.time || field.field != null && field.field.isTimeBased() )
{ {
if ( time == null ) if ( time == null )
{ {
time = new ConstructTime(); time = new ConstructTime();
} }
time.assign( field, value ); time.assign( field, value );
} }
else
{
throw new IllegalStateException( "This method should not be used for any fields the DateBuilder or TimeBuilder can't handle" );
}
return this; return this;
} }
} }


private static class SelectDateTimeDTBuilder extends DateTimeBuilder private static class SelectDateTimeDTBuilder extends DateTimeBuilder
{ {
private AnyValue datetime;
private AnyValue epoch;

SelectDateTimeDTBuilder( DateBuilder date, ConstructTime time ) SelectDateTimeDTBuilder( DateBuilder date, ConstructTime time )
{ {
super( date, time ); super( date, time );
Expand All @@ -680,16 +687,29 @@ DateTimeBuilder assign( Field field, AnyValue value )
{ {
if ( field == Field.date || field == Field.time ) if ( field == Field.date || field == Field.time )
{ {
throw new IllegalArgumentException( field.name() + " cannot be selected together with datetime." ); throw new IllegalArgumentException( field.name() + " cannot be selected together with datetime or epoch." );
} }
else if ( field == Field.datetime ) else if ( field == Field.datetime )
{ {
throw new IllegalArgumentException( "cannot re-assign " + field ); if ( epoch != null )
{
throw new IllegalArgumentException( field.name() + " cannot be selected together with epoch." );
}
datetime = assignment( Field.datetime, datetime, value );
}
else if ( field == Field.epoch )
{
if ( datetime != null )
{
throw new IllegalArgumentException( field.name() + " cannot be selected together with datetime." );
}
epoch = assignment( Field.epoch, epoch, value );
} }
else else
{ {
return assignNonComposite( field, value ); return assignToSubBuilders( field, value );
} }
return this;
} }
} }


Expand All @@ -703,13 +723,13 @@ private static class SelectDateOrTimeDTBuilder extends DateTimeBuilder
@Override @Override
DateTimeBuilder assign( Field field, AnyValue value ) DateTimeBuilder assign( Field field, AnyValue value )
{ {
if ( field == Field.datetime ) if ( field == Field.datetime || field == Field.epoch )
{ {
throw new IllegalArgumentException( field.name() + " cannot be selected together with date or time." ); throw new IllegalArgumentException( field.name() + " cannot be selected together with date or time." );
} }
else else
{ {
return assignNonComposite( field, value ); return assignToSubBuilders( field, value );
} }
} }
} }
Expand Down
Expand Up @@ -113,7 +113,8 @@ class TemporalAcceptanceTest extends ExecutionEngineFunSuite with QueryStatistic
"{year:1984, month: 2, quarter:11}", "{year:1984, month: 2, dayOfQuarter:11}", "{year:1984, month: 2, quarter:11}", "{year:1984, month: 2, dayOfQuarter:11}",
"{year:1984, week: 2, day:11}", "{year:1984, week: 2, quarter:11}", "{year:1984, week: 2, dayOfQuarter:11}", "{year:1984, week: 2, day:11}", "{year:1984, week: 2, quarter:11}", "{year:1984, week: 2, dayOfQuarter:11}",
"{year:1984, quarter: 2, day:11}", "{year:1984, quarter: 2, dayOfWeek:6}", "{datetime: datetime(), date: date()}", "{year:1984, quarter: 2, day:11}", "{year:1984, quarter: 2, dayOfWeek:6}", "{datetime: datetime(), date: date()}",
"{datetime: datetime(), time: time()}") "{datetime: datetime(), time: time()}", "{datetime: datetime(), epoch: timestamp()}", "{date: date(), epoch: timestamp()}",
"{time: time(), epoch: timestamp()}")
shouldNotConstructWithArg("datetime", queries) shouldNotConstructWithArg("datetime", queries)
} }


Expand Down

0 comments on commit cf32135

Please sign in to comment.