Replace DvDateTimeZone, DvDateTime, DvTimeSpan with .NET standard types. - #693

Closed
codemzs wants to merge 24 commits into
dotnet:masterfrom
codemzs:dvdatetime
Closed

Replace DvDateTimeZone, DvDateTime, DvTimeSpan with .NET standard types.#693
codemzs wants to merge 24 commits into
dotnet:masterfrom
codemzs:dvdatetime

Conversation

@codemzs

@codemzscodemzs commented Aug 19, 2018

Copy link
Copy Markdown
Member

fixes#673

@codemzs
codemzs requested review from Ivanidzo4ka, TomFinley, Zruty0, dotnet-bot and eerhardt and removed request for dotnet-botAugust 19, 2018 07:10
@codemzs

codemzs commented Aug 19, 2018

Copy link
Copy Markdown
MemberAuthor

@TomFinley@eerhardt Do we need missing value support for datetime, timespan, datetimeoffset? These are structs so may be use default as missing values? For now I have assumed there is no missing value indicator but I can add it back. #Resolved

RegisterSimpleCodec(new UnsafeTypeCodec<Single>(this));
RegisterSimpleCodec(new UnsafeTypeCodec<Double>(this));
RegisterSimpleCodec(new UnsafeTypeCodec<DvTimeSpan>(this));
RegisterSimpleCodec(new UnsafeTypeCodec<TimeSpan>(this));

@Ivanidzo4kaIvanidzo4kaAug 19, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

UnsafeTypeCodec [](start = 36, length = 15)

Is it still need to be UnsafeTypeCodec? #Resolved

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What should it be? I have defined TimeSpanUnsafeTypeOps to handle this type.


In reply to: 211110052 [](ancestors = 211110052)

@TomFinley

Copy link
Copy Markdown
Contributor

Hi @codemzs not sure I understand, are you proposing that the type for these structures be, for instance, not DateTime but DateTime? given that the default value for DataTime is not sensible?


In reply to: 414136160 [](ancestors = 414136160)

Comment threadsrc/Microsoft.ML/Data/TextLoader.cs Outdated
else if (type == typeof(DateTime))
kind = DataKind.DT;
else if (type == typeof(DvDateTimeZone) || type == typeof(TimeZoneInfo))
else if (type == typeof(DateTimeOffset) || type == typeof(TimeZoneInfo))

@TomFinleyTomFinleyAug 20, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

TimeZoneInfo [](start = 70, length = 12)

In what way does a TimeZoneInfo map into a DateTimeOffset? #Resolved

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I agree this seems totally wrong.


In reply to: 211315779 [](ancestors = 211315779)

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It was a miss, I did intend to remove it.


In reply to: 211662608 [](ancestors = 211662608,211315779)


/// <summary>
/// Whether this type is a DvDateTime.
/// Whether this type is a DateTime.

@TomFinleyTomFinleyAug 20, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

DateTime [](start = 35, length = 8)

<see tags perhaps #Resolved

@TomFinley

TomFinley commented Aug 20, 2018

Copy link
Copy Markdown
Contributor
 return true;

I know you didn't write this code but this if (...) return false; return true; type code is incredibly annoying to me...

Maybe:

Contracts.Assert((this==DateTimeType.Instance)==(thisisDateTimeType));returnthisis DateTimeType

Similar cleanup possible for the other Is properties here. #Resolved


Refers to: src/Microsoft.ML.Core/Data/ColumnType.cs:148 in e0d66b0. [](commit_id = e0d66b0, deletion_comment = False)

}
dst = DvDateTime.NA;

return IsStdMissing(ref src);

@TomFinleyTomFinleyAug 20, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

IsStdMissing(ref src); [](start = 19, length = 22)

So I feel like if you parse missing into a value type that does not support missing, we might expect the result to be that we would throw, rather than just the default value. #Resolved

}
dst = DvDateTimeZone.NA;

return IsStdMissing(ref src);

@TomFinleyTomFinleyAug 20, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

IsStdMissing [](start = 19, length = 12)

Similar for this. #Resolved

@TomFinley

TomFinley commented Aug 20, 2018

Copy link
Copy Markdown
Contributor

I might have expected to see some change where we take out DvDateTime, Dv... etc. Is it not so? #Resolved

private sealed class Writer : ValueWriterBase<DvDateTimeZone>
private sealed class Writer : ValueWriterBase<DateTimeOffset>
{
private List<short> _offsets;

@eerhardteerhardtAug 21, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not sure on how concerned we need to be with sizes, but an offset can only be in the range of -14 to 14 hours. So using a long seems like a bit of an overkill.

It also appears that previously the _offsets was the number of minutes in the offset. Now we are using the number of ticks in the offset. Do we need to be concerned with this difference? #Resolved

@codemzscodemzsAug 23, 2018

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

.NET standard type has offsets in ticks. We could convert offset in minutes when writing to disk and convert it back to ticks when reading but we may lose precision. What do you think?


In reply to: 211667357 [](ancestors = 211667357)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

DateTimeOffset exposes its offset as a TimeSpan, but internally it uses short and in minutes.

https://github.com/dotnet/coreclr/blob/9499b08eefd895158c3f3c7834e185a73619128d/src/System.Private.CoreLib/shared/System/DateTimeOffset.cs#L51-L53

https://github.com/dotnet/coreclr/blob/9499b08eefd895158c3f3c7834e185a73619128d/src/System.Private.CoreLib/shared/System/DateTimeOffset.cs#L286-L292

From everything I can find online (ISO8601, RFC3339, SQL Server doc), the offset supports the range -14 to 14 hours, and only supports minute precision.


In reply to: 212488658 [](ancestors = 212488658,211667357)

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks a lot! this is helpful. I'm now writing the ticks in minutes as short values because they are already validated when TimeSpan is created and when reading I convert the minutes back into Ticks when creating the TimeSpan object.


In reply to: 212670585 [](ancestors = 212670585,212488658,211667357)

return GetComparerOne<DvBool>(r1, r2, col, (x, y) => x.Equals(y));
case DataKind.TimeSpan:
return GetComparerOne<DvTimeSpan>(r1, r2, col, (x, y) => x.Equals(y));
return GetComparerOne<TimeSpan>(r1, r2, col, (x, y) => x.Ticks == y.Ticks);

@TomFinleyTomFinleyAug 22, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

TimeSpan [](start = 42, length = 8)

As near as I can see, both TimeSpan and DateTime are directly comparable, that might be better. #Resolved

//https://github.com/dotnet/coreclr/blob/9499b08eefd895158c3f3c7834e185a73619128d/src/System.Private.CoreLib/shared/System/DateTimeOffset.cs#L51-L53
//https://github.com/dotnet/coreclr/blob/9499b08eefd895158c3f3c7834e185a73619128d/src/System.Private.CoreLib/shared/System/DateTimeOffset.cs#L286-L292
//From everything online(ISO8601, RFC3339, SQL Server doc, the offset supports the range -14 to 14 hours, and only supports minute precision.
_offsets.Add((short)(value.Offset.Ticks / TimeSpan.TicksPerMinute));

@eerhardteerhardtAug 28, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why can't this just be value.TotalMinutes? #Resolved

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

don't see totalMinutes under value, did you mean under offset?


In reply to: 213152272 [](ancestors = 213152272)

@eerhardteerhardtAug 28, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, value.Offset.TotalMinutes #Resolved

{
Contracts.Assert(!_disposed);
value = new DvDateTimeZone(_ticks[_index], _offsets[_index]);
value = new DateTimeOffset(new DateTime(_ticks[_index]), new TimeSpan(_offsets[_index] * TimeSpan.TicksPerMinute));

@eerhardteerhardtAug 28, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

new TimeSpan(_offsets[_index] * TimeSpan.TicksPerMinute) should be new TimeSpan(0, _offsets[_index], 0) #Resolved

RegisterOtherCodec("DvDateTimeZone", new DateTimeOffsetCodec(this).GetCodec);
RegisterOtherCodec("DvDateTime", new DateTimeCodec(this).GetCodec);
RegisterOtherCodec("DvTimeSpan", new UnsafeTypeCodec<TimeSpan>(this).GetCodec);
RegisterOtherCodec("Key", GetKeyCodec);

@TomFinleyTomFinleyAug 28, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I see the new test helped show up some issues.

BTW where are we testing the writing of data into what amounts to a new format? #Resolved

@codemzscodemzsAug 28, 2018

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We have a test that reads from the old IDV format then it writes back as text and that is where writing of data into new format is tested. Also for date/time the serialization format has not changed. I believe it only changed for bools.


In reply to: 213349875 [](ancestors = 213349875)

@TomFinleyTomFinleyAug 29, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe a simple way to do this is modify your test a little bit.

Currently it is something like this.

TestCore("savedata",idvPath,"loader=binary","saver=text",textOutputPath.Arg("dout"));

If we modify it to be this:

varintermediateData=/// some temp IDV file.TestCore("savedata",idvPath,"loader=binary","saver=text",textOutputPath.Arg("dout"));TestCore("savedata",idvPath,"loader=binary","saver=binary",intermediateData.ArgOnly("dout"));TestCore("savedata",intermediateData,"loader=binary","saver=text",textOutputPath.Arg("dout"));

That will test everything. #Resolved

@shauheenshauheen added the enhancement New feature or request label Aug 28, 2018
@shauheenshauheen added this to the 0818 milestone Aug 28, 2018
@shauheenshauheen removed this from the 0818 milestone Aug 30, 2018
…to dvdatetime
# Conflicts:
#	test/BaselineOutput/SingleDebug/SavePipe/TestParquetPrimitiveDataTypes-Data.txt
#	test/BaselineOutput/SingleDebug/SavePipe/TestParquetPrimitiveDataTypes-Schema.txt
#	test/BaselineOutput/SingleRelease/SavePipe/TestParquetPrimitiveDataTypes-Data.txt
#	test/BaselineOutput/SingleRelease/SavePipe/TestParquetPrimitiveDataTypes-Schema.txt
#	test/data/Parquet/alltypes.parquet
@codemzs

Copy link
Copy Markdown
MemberAuthor

This change was committed via #863

@codemzscodemzs closed this Sep 20, 2018
@codemzs
codemzs deleted the dvdatetime branch September 20, 2018 18:16
@ghostghost locked as resolved and limited conversation to collaborators Mar 29, 2022
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

enhancementNew feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

.NET data type system instead of DvTypes

5 participants

@codemzs@TomFinley@Ivanidzo4ka@eerhardt@shauheen
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Replace DvDateTimeZone, DvDateTime, DvTimeSpan with .NET standard types. - #693

Closed
codemzs wants to merge 24 commits into
dotnet:masterfrom
codemzs:dvdatetime
Closed

Replace DvDateTimeZone, DvDateTime, DvTimeSpan with .NET standard types.#693
codemzs wants to merge 24 commits into
dotnet:masterfrom
codemzs:dvdatetime

Conversation

@codemzs

@codemzscodemzs commented Aug 19, 2018

Copy link
Copy Markdown
Member

fixes#673

@codemzs
codemzs requested review from Ivanidzo4ka, TomFinley, Zruty0, dotnet-bot and eerhardt and removed request for dotnet-botAugust 19, 2018 07:10
@codemzs

codemzs commented Aug 19, 2018

Copy link
Copy Markdown
MemberAuthor

@TomFinley@eerhardt Do we need missing value support for datetime, timespan, datetimeoffset? These are structs so may be use default as missing values? For now I have assumed there is no missing value indicator but I can add it back. #Resolved

RegisterSimpleCodec(new UnsafeTypeCodec<Single>(this));
RegisterSimpleCodec(new UnsafeTypeCodec<Double>(this));
RegisterSimpleCodec(new UnsafeTypeCodec<DvTimeSpan>(this));
RegisterSimpleCodec(new UnsafeTypeCodec<TimeSpan>(this));

@Ivanidzo4kaIvanidzo4kaAug 19, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

UnsafeTypeCodec [](start = 36, length = 15)

Is it still need to be UnsafeTypeCodec? #Resolved

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What should it be? I have defined TimeSpanUnsafeTypeOps to handle this type.


In reply to: 211110052 [](ancestors = 211110052)

@TomFinley

Copy link
Copy Markdown
Contributor

Hi @codemzs not sure I understand, are you proposing that the type for these structures be, for instance, not DateTime but DateTime? given that the default value for DataTime is not sensible?


In reply to: 414136160 [](ancestors = 414136160)

Comment threadsrc/Microsoft.ML/Data/TextLoader.cs Outdated
else if (type == typeof(DateTime))
kind = DataKind.DT;
else if (type == typeof(DvDateTimeZone) || type == typeof(TimeZoneInfo))
else if (type == typeof(DateTimeOffset) || type == typeof(TimeZoneInfo))

@TomFinleyTomFinleyAug 20, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

TimeZoneInfo [](start = 70, length = 12)

In what way does a TimeZoneInfo map into a DateTimeOffset? #Resolved

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I agree this seems totally wrong.


In reply to: 211315779 [](ancestors = 211315779)

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It was a miss, I did intend to remove it.


In reply to: 211662608 [](ancestors = 211662608,211315779)


/// <summary>
/// Whether this type is a DvDateTime.
/// Whether this type is a DateTime.

@TomFinleyTomFinleyAug 20, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

DateTime [](start = 35, length = 8)

<see tags perhaps #Resolved

@TomFinley

TomFinley commented Aug 20, 2018

Copy link
Copy Markdown
Contributor
 return true;

I know you didn't write this code but this if (...) return false; return true; type code is incredibly annoying to me...

Maybe:

Contracts.Assert((this==DateTimeType.Instance)==(thisisDateTimeType));returnthisis DateTimeType

Similar cleanup possible for the other Is properties here. #Resolved


Refers to: src/Microsoft.ML.Core/Data/ColumnType.cs:148 in e0d66b0. [](commit_id = e0d66b0, deletion_comment = False)

}
dst = DvDateTime.NA;

return IsStdMissing(ref src);

@TomFinleyTomFinleyAug 20, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

IsStdMissing(ref src); [](start = 19, length = 22)

So I feel like if you parse missing into a value type that does not support missing, we might expect the result to be that we would throw, rather than just the default value. #Resolved

}
dst = DvDateTimeZone.NA;

return IsStdMissing(ref src);

@TomFinleyTomFinleyAug 20, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

IsStdMissing [](start = 19, length = 12)

Similar for this. #Resolved

@TomFinley

TomFinley commented Aug 20, 2018

Copy link
Copy Markdown
Contributor

I might have expected to see some change where we take out DvDateTime, Dv... etc. Is it not so? #Resolved

private sealed class Writer : ValueWriterBase<DvDateTimeZone>
private sealed class Writer : ValueWriterBase<DateTimeOffset>
{
private List<short> _offsets;

@eerhardteerhardtAug 21, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not sure on how concerned we need to be with sizes, but an offset can only be in the range of -14 to 14 hours. So using a long seems like a bit of an overkill.

It also appears that previously the _offsets was the number of minutes in the offset. Now we are using the number of ticks in the offset. Do we need to be concerned with this difference? #Resolved

@codemzscodemzsAug 23, 2018

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

.NET standard type has offsets in ticks. We could convert offset in minutes when writing to disk and convert it back to ticks when reading but we may lose precision. What do you think?


In reply to: 211667357 [](ancestors = 211667357)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

DateTimeOffset exposes its offset as a TimeSpan, but internally it uses short and in minutes.

https://github.com/dotnet/coreclr/blob/9499b08eefd895158c3f3c7834e185a73619128d/src/System.Private.CoreLib/shared/System/DateTimeOffset.cs#L51-L53

https://github.com/dotnet/coreclr/blob/9499b08eefd895158c3f3c7834e185a73619128d/src/System.Private.CoreLib/shared/System/DateTimeOffset.cs#L286-L292

From everything I can find online (ISO8601, RFC3339, SQL Server doc), the offset supports the range -14 to 14 hours, and only supports minute precision.


In reply to: 212488658 [](ancestors = 212488658,211667357)

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks a lot! this is helpful. I'm now writing the ticks in minutes as short values because they are already validated when TimeSpan is created and when reading I convert the minutes back into Ticks when creating the TimeSpan object.


In reply to: 212670585 [](ancestors = 212670585,212488658,211667357)

return GetComparerOne<DvBool>(r1, r2, col, (x, y) => x.Equals(y));
case DataKind.TimeSpan:
return GetComparerOne<DvTimeSpan>(r1, r2, col, (x, y) => x.Equals(y));
return GetComparerOne<TimeSpan>(r1, r2, col, (x, y) => x.Ticks == y.Ticks);

@TomFinleyTomFinleyAug 22, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

TimeSpan [](start = 42, length = 8)

As near as I can see, both TimeSpan and DateTime are directly comparable, that might be better. #Resolved

//https://github.com/dotnet/coreclr/blob/9499b08eefd895158c3f3c7834e185a73619128d/src/System.Private.CoreLib/shared/System/DateTimeOffset.cs#L51-L53
//https://github.com/dotnet/coreclr/blob/9499b08eefd895158c3f3c7834e185a73619128d/src/System.Private.CoreLib/shared/System/DateTimeOffset.cs#L286-L292
//From everything online(ISO8601, RFC3339, SQL Server doc, the offset supports the range -14 to 14 hours, and only supports minute precision.
_offsets.Add((short)(value.Offset.Ticks / TimeSpan.TicksPerMinute));

@eerhardteerhardtAug 28, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why can't this just be value.TotalMinutes? #Resolved

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

don't see totalMinutes under value, did you mean under offset?


In reply to: 213152272 [](ancestors = 213152272)

@eerhardteerhardtAug 28, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, value.Offset.TotalMinutes #Resolved

{
Contracts.Assert(!_disposed);
value = new DvDateTimeZone(_ticks[_index], _offsets[_index]);
value = new DateTimeOffset(new DateTime(_ticks[_index]), new TimeSpan(_offsets[_index] * TimeSpan.TicksPerMinute));

@eerhardteerhardtAug 28, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

new TimeSpan(_offsets[_index] * TimeSpan.TicksPerMinute) should be new TimeSpan(0, _offsets[_index], 0) #Resolved

RegisterOtherCodec("DvDateTimeZone", new DateTimeOffsetCodec(this).GetCodec);
RegisterOtherCodec("DvDateTime", new DateTimeCodec(this).GetCodec);
RegisterOtherCodec("DvTimeSpan", new UnsafeTypeCodec<TimeSpan>(this).GetCodec);
RegisterOtherCodec("Key", GetKeyCodec);

@TomFinleyTomFinleyAug 28, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I see the new test helped show up some issues.

BTW where are we testing the writing of data into what amounts to a new format? #Resolved

@codemzscodemzsAug 28, 2018

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We have a test that reads from the old IDV format then it writes back as text and that is where writing of data into new format is tested. Also for date/time the serialization format has not changed. I believe it only changed for bools.


In reply to: 213349875 [](ancestors = 213349875)

@TomFinleyTomFinleyAug 29, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe a simple way to do this is modify your test a little bit.

Currently it is something like this.

TestCore("savedata",idvPath,"loader=binary","saver=text",textOutputPath.Arg("dout"));

If we modify it to be this:

varintermediateData=/// some temp IDV file.TestCore("savedata",idvPath,"loader=binary","saver=text",textOutputPath.Arg("dout"));TestCore("savedata",idvPath,"loader=binary","saver=binary",intermediateData.ArgOnly("dout"));TestCore("savedata",intermediateData,"loader=binary","saver=text",textOutputPath.Arg("dout"));

That will test everything. #Resolved

@shauheenshauheen added the enhancement New feature or request label Aug 28, 2018
@shauheenshauheen added this to the 0818 milestone Aug 28, 2018
@shauheenshauheen removed this from the 0818 milestone Aug 30, 2018
…to dvdatetime
# Conflicts:
#	test/BaselineOutput/SingleDebug/SavePipe/TestParquetPrimitiveDataTypes-Data.txt
#	test/BaselineOutput/SingleDebug/SavePipe/TestParquetPrimitiveDataTypes-Schema.txt
#	test/BaselineOutput/SingleRelease/SavePipe/TestParquetPrimitiveDataTypes-Data.txt
#	test/BaselineOutput/SingleRelease/SavePipe/TestParquetPrimitiveDataTypes-Schema.txt
#	test/data/Parquet/alltypes.parquet
@codemzs

Copy link
Copy Markdown
MemberAuthor

This change was committed via #863

@codemzscodemzs closed this Sep 20, 2018
@codemzs
codemzs deleted the dvdatetime branch September 20, 2018 18:16
@ghostghost locked as resolved and limited conversation to collaborators Mar 29, 2022
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

enhancementNew feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

.NET data type system instead of DvTypes

5 participants

@codemzs@TomFinley@Ivanidzo4ka@eerhardt@shauheen
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Replace DvDateTimeZone, DvDateTime, DvTimeSpan with .NET standard types. - #693

Closed
codemzs wants to merge 24 commits into
dotnet:masterfrom
codemzs:dvdatetime
Closed

Replace DvDateTimeZone, DvDateTime, DvTimeSpan with .NET standard types.#693
codemzs wants to merge 24 commits into
dotnet:masterfrom
codemzs:dvdatetime

Conversation

@codemzs

@codemzscodemzs commented Aug 19, 2018

Copy link
Copy Markdown
Member

fixes#673

@codemzs
codemzs requested review from Ivanidzo4ka, TomFinley, Zruty0, dotnet-bot and eerhardt and removed request for dotnet-botAugust 19, 2018 07:10
@codemzs

codemzs commented Aug 19, 2018

Copy link
Copy Markdown
MemberAuthor

@TomFinley@eerhardt Do we need missing value support for datetime, timespan, datetimeoffset? These are structs so may be use default as missing values? For now I have assumed there is no missing value indicator but I can add it back. #Resolved

RegisterSimpleCodec(new UnsafeTypeCodec<Single>(this));
RegisterSimpleCodec(new UnsafeTypeCodec<Double>(this));
RegisterSimpleCodec(new UnsafeTypeCodec<DvTimeSpan>(this));
RegisterSimpleCodec(new UnsafeTypeCodec<TimeSpan>(this));

@Ivanidzo4kaIvanidzo4kaAug 19, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

UnsafeTypeCodec [](start = 36, length = 15)

Is it still need to be UnsafeTypeCodec? #Resolved

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What should it be? I have defined TimeSpanUnsafeTypeOps to handle this type.


In reply to: 211110052 [](ancestors = 211110052)

@TomFinley

Copy link
Copy Markdown
Contributor

Hi @codemzs not sure I understand, are you proposing that the type for these structures be, for instance, not DateTime but DateTime? given that the default value for DataTime is not sensible?


In reply to: 414136160 [](ancestors = 414136160)

Comment threadsrc/Microsoft.ML/Data/TextLoader.cs Outdated
else if (type == typeof(DateTime))
kind = DataKind.DT;
else if (type == typeof(DvDateTimeZone) || type == typeof(TimeZoneInfo))
else if (type == typeof(DateTimeOffset) || type == typeof(TimeZoneInfo))

@TomFinleyTomFinleyAug 20, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

TimeZoneInfo [](start = 70, length = 12)

In what way does a TimeZoneInfo map into a DateTimeOffset? #Resolved

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I agree this seems totally wrong.


In reply to: 211315779 [](ancestors = 211315779)

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It was a miss, I did intend to remove it.


In reply to: 211662608 [](ancestors = 211662608,211315779)


/// <summary>
/// Whether this type is a DvDateTime.
/// Whether this type is a DateTime.

@TomFinleyTomFinleyAug 20, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

DateTime [](start = 35, length = 8)

<see tags perhaps #Resolved

@TomFinley

TomFinley commented Aug 20, 2018

Copy link
Copy Markdown
Contributor
 return true;

I know you didn't write this code but this if (...) return false; return true; type code is incredibly annoying to me...

Maybe:

Contracts.Assert((this==DateTimeType.Instance)==(thisisDateTimeType));returnthisis DateTimeType

Similar cleanup possible for the other Is properties here. #Resolved


Refers to: src/Microsoft.ML.Core/Data/ColumnType.cs:148 in e0d66b0. [](commit_id = e0d66b0, deletion_comment = False)

}
dst = DvDateTime.NA;

return IsStdMissing(ref src);

@TomFinleyTomFinleyAug 20, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

IsStdMissing(ref src); [](start = 19, length = 22)

So I feel like if you parse missing into a value type that does not support missing, we might expect the result to be that we would throw, rather than just the default value. #Resolved

}
dst = DvDateTimeZone.NA;

return IsStdMissing(ref src);

@TomFinleyTomFinleyAug 20, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

IsStdMissing [](start = 19, length = 12)

Similar for this. #Resolved

@TomFinley

TomFinley commented Aug 20, 2018

Copy link
Copy Markdown
Contributor

I might have expected to see some change where we take out DvDateTime, Dv... etc. Is it not so? #Resolved

private sealed class Writer : ValueWriterBase<DvDateTimeZone>
private sealed class Writer : ValueWriterBase<DateTimeOffset>
{
private List<short> _offsets;

@eerhardteerhardtAug 21, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not sure on how concerned we need to be with sizes, but an offset can only be in the range of -14 to 14 hours. So using a long seems like a bit of an overkill.

It also appears that previously the _offsets was the number of minutes in the offset. Now we are using the number of ticks in the offset. Do we need to be concerned with this difference? #Resolved

@codemzscodemzsAug 23, 2018

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

.NET standard type has offsets in ticks. We could convert offset in minutes when writing to disk and convert it back to ticks when reading but we may lose precision. What do you think?


In reply to: 211667357 [](ancestors = 211667357)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

DateTimeOffset exposes its offset as a TimeSpan, but internally it uses short and in minutes.

https://github.com/dotnet/coreclr/blob/9499b08eefd895158c3f3c7834e185a73619128d/src/System.Private.CoreLib/shared/System/DateTimeOffset.cs#L51-L53

https://github.com/dotnet/coreclr/blob/9499b08eefd895158c3f3c7834e185a73619128d/src/System.Private.CoreLib/shared/System/DateTimeOffset.cs#L286-L292

From everything I can find online (ISO8601, RFC3339, SQL Server doc), the offset supports the range -14 to 14 hours, and only supports minute precision.


In reply to: 212488658 [](ancestors = 212488658,211667357)

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks a lot! this is helpful. I'm now writing the ticks in minutes as short values because they are already validated when TimeSpan is created and when reading I convert the minutes back into Ticks when creating the TimeSpan object.


In reply to: 212670585 [](ancestors = 212670585,212488658,211667357)

return GetComparerOne<DvBool>(r1, r2, col, (x, y) => x.Equals(y));
case DataKind.TimeSpan:
return GetComparerOne<DvTimeSpan>(r1, r2, col, (x, y) => x.Equals(y));
return GetComparerOne<TimeSpan>(r1, r2, col, (x, y) => x.Ticks == y.Ticks);

@TomFinleyTomFinleyAug 22, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

TimeSpan [](start = 42, length = 8)

As near as I can see, both TimeSpan and DateTime are directly comparable, that might be better. #Resolved

//https://github.com/dotnet/coreclr/blob/9499b08eefd895158c3f3c7834e185a73619128d/src/System.Private.CoreLib/shared/System/DateTimeOffset.cs#L51-L53
//https://github.com/dotnet/coreclr/blob/9499b08eefd895158c3f3c7834e185a73619128d/src/System.Private.CoreLib/shared/System/DateTimeOffset.cs#L286-L292
//From everything online(ISO8601, RFC3339, SQL Server doc, the offset supports the range -14 to 14 hours, and only supports minute precision.
_offsets.Add((short)(value.Offset.Ticks / TimeSpan.TicksPerMinute));

@eerhardteerhardtAug 28, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why can't this just be value.TotalMinutes? #Resolved

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

don't see totalMinutes under value, did you mean under offset?


In reply to: 213152272 [](ancestors = 213152272)

@eerhardteerhardtAug 28, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, value.Offset.TotalMinutes #Resolved

{
Contracts.Assert(!_disposed);
value = new DvDateTimeZone(_ticks[_index], _offsets[_index]);
value = new DateTimeOffset(new DateTime(_ticks[_index]), new TimeSpan(_offsets[_index] * TimeSpan.TicksPerMinute));

@eerhardteerhardtAug 28, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

new TimeSpan(_offsets[_index] * TimeSpan.TicksPerMinute) should be new TimeSpan(0, _offsets[_index], 0) #Resolved

RegisterOtherCodec("DvDateTimeZone", new DateTimeOffsetCodec(this).GetCodec);
RegisterOtherCodec("DvDateTime", new DateTimeCodec(this).GetCodec);
RegisterOtherCodec("DvTimeSpan", new UnsafeTypeCodec<TimeSpan>(this).GetCodec);
RegisterOtherCodec("Key", GetKeyCodec);

@TomFinleyTomFinleyAug 28, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I see the new test helped show up some issues.

BTW where are we testing the writing of data into what amounts to a new format? #Resolved

@codemzscodemzsAug 28, 2018

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We have a test that reads from the old IDV format then it writes back as text and that is where writing of data into new format is tested. Also for date/time the serialization format has not changed. I believe it only changed for bools.


In reply to: 213349875 [](ancestors = 213349875)

@TomFinleyTomFinleyAug 29, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe a simple way to do this is modify your test a little bit.

Currently it is something like this.

TestCore("savedata",idvPath,"loader=binary","saver=text",textOutputPath.Arg("dout"));

If we modify it to be this:

varintermediateData=/// some temp IDV file.TestCore("savedata",idvPath,"loader=binary","saver=text",textOutputPath.Arg("dout"));TestCore("savedata",idvPath,"loader=binary","saver=binary",intermediateData.ArgOnly("dout"));TestCore("savedata",intermediateData,"loader=binary","saver=text",textOutputPath.Arg("dout"));

That will test everything. #Resolved

@shauheenshauheen added the enhancement New feature or request label Aug 28, 2018
@shauheenshauheen added this to the 0818 milestone Aug 28, 2018
@shauheenshauheen removed this from the 0818 milestone Aug 30, 2018
…to dvdatetime
# Conflicts:
#	test/BaselineOutput/SingleDebug/SavePipe/TestParquetPrimitiveDataTypes-Data.txt
#	test/BaselineOutput/SingleDebug/SavePipe/TestParquetPrimitiveDataTypes-Schema.txt
#	test/BaselineOutput/SingleRelease/SavePipe/TestParquetPrimitiveDataTypes-Data.txt
#	test/BaselineOutput/SingleRelease/SavePipe/TestParquetPrimitiveDataTypes-Schema.txt
#	test/data/Parquet/alltypes.parquet
@codemzs

Copy link
Copy Markdown
MemberAuthor

This change was committed via #863

@codemzscodemzs closed this Sep 20, 2018
@codemzs
codemzs deleted the dvdatetime branch September 20, 2018 18:16
@ghostghost locked as resolved and limited conversation to collaborators Mar 29, 2022
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

enhancementNew feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

.NET data type system instead of DvTypes

5 participants

@codemzs@TomFinley@Ivanidzo4ka@eerhardt@shauheen
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Replace DvDateTimeZone, DvDateTime, DvTimeSpan with .NET standard types. - #693

Closed
codemzs wants to merge 24 commits into
dotnet:masterfrom
codemzs:dvdatetime
Closed

Replace DvDateTimeZone, DvDateTime, DvTimeSpan with .NET standard types.#693
codemzs wants to merge 24 commits into
dotnet:masterfrom
codemzs:dvdatetime

Conversation

@codemzs

@codemzscodemzs commented Aug 19, 2018

Copy link
Copy Markdown
Member

fixes#673

@codemzs
codemzs requested review from Ivanidzo4ka, TomFinley, Zruty0, dotnet-bot and eerhardt and removed request for dotnet-botAugust 19, 2018 07:10
@codemzs

codemzs commented Aug 19, 2018

Copy link
Copy Markdown
MemberAuthor

@TomFinley@eerhardt Do we need missing value support for datetime, timespan, datetimeoffset? These are structs so may be use default as missing values? For now I have assumed there is no missing value indicator but I can add it back. #Resolved

RegisterSimpleCodec(new UnsafeTypeCodec<Single>(this));
RegisterSimpleCodec(new UnsafeTypeCodec<Double>(this));
RegisterSimpleCodec(new UnsafeTypeCodec<DvTimeSpan>(this));
RegisterSimpleCodec(new UnsafeTypeCodec<TimeSpan>(this));

@Ivanidzo4kaIvanidzo4kaAug 19, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

UnsafeTypeCodec [](start = 36, length = 15)

Is it still need to be UnsafeTypeCodec? #Resolved

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What should it be? I have defined TimeSpanUnsafeTypeOps to handle this type.


In reply to: 211110052 [](ancestors = 211110052)

@TomFinley

Copy link
Copy Markdown
Contributor

Hi @codemzs not sure I understand, are you proposing that the type for these structures be, for instance, not DateTime but DateTime? given that the default value for DataTime is not sensible?


In reply to: 414136160 [](ancestors = 414136160)

Comment threadsrc/Microsoft.ML/Data/TextLoader.cs Outdated
else if (type == typeof(DateTime))
kind = DataKind.DT;
else if (type == typeof(DvDateTimeZone) || type == typeof(TimeZoneInfo))
else if (type == typeof(DateTimeOffset) || type == typeof(TimeZoneInfo))

@TomFinleyTomFinleyAug 20, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

TimeZoneInfo [](start = 70, length = 12)

In what way does a TimeZoneInfo map into a DateTimeOffset? #Resolved

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I agree this seems totally wrong.


In reply to: 211315779 [](ancestors = 211315779)

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It was a miss, I did intend to remove it.


In reply to: 211662608 [](ancestors = 211662608,211315779)


/// <summary>
/// Whether this type is a DvDateTime.
/// Whether this type is a DateTime.

@TomFinleyTomFinleyAug 20, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

DateTime [](start = 35, length = 8)

<see tags perhaps #Resolved

@TomFinley

TomFinley commented Aug 20, 2018

Copy link
Copy Markdown
Contributor
 return true;

I know you didn't write this code but this if (...) return false; return true; type code is incredibly annoying to me...

Maybe:

Contracts.Assert((this==DateTimeType.Instance)==(thisisDateTimeType));returnthisis DateTimeType

Similar cleanup possible for the other Is properties here. #Resolved


Refers to: src/Microsoft.ML.Core/Data/ColumnType.cs:148 in e0d66b0. [](commit_id = e0d66b0, deletion_comment = False)

}
dst = DvDateTime.NA;

return IsStdMissing(ref src);

@TomFinleyTomFinleyAug 20, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

IsStdMissing(ref src); [](start = 19, length = 22)

So I feel like if you parse missing into a value type that does not support missing, we might expect the result to be that we would throw, rather than just the default value. #Resolved

}
dst = DvDateTimeZone.NA;

return IsStdMissing(ref src);

@TomFinleyTomFinleyAug 20, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

IsStdMissing [](start = 19, length = 12)

Similar for this. #Resolved

@TomFinley

TomFinley commented Aug 20, 2018

Copy link
Copy Markdown
Contributor

I might have expected to see some change where we take out DvDateTime, Dv... etc. Is it not so? #Resolved

private sealed class Writer : ValueWriterBase<DvDateTimeZone>
private sealed class Writer : ValueWriterBase<DateTimeOffset>
{
private List<short> _offsets;

@eerhardteerhardtAug 21, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not sure on how concerned we need to be with sizes, but an offset can only be in the range of -14 to 14 hours. So using a long seems like a bit of an overkill.

It also appears that previously the _offsets was the number of minutes in the offset. Now we are using the number of ticks in the offset. Do we need to be concerned with this difference? #Resolved

@codemzscodemzsAug 23, 2018

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

.NET standard type has offsets in ticks. We could convert offset in minutes when writing to disk and convert it back to ticks when reading but we may lose precision. What do you think?


In reply to: 211667357 [](ancestors = 211667357)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

DateTimeOffset exposes its offset as a TimeSpan, but internally it uses short and in minutes.

https://github.com/dotnet/coreclr/blob/9499b08eefd895158c3f3c7834e185a73619128d/src/System.Private.CoreLib/shared/System/DateTimeOffset.cs#L51-L53

https://github.com/dotnet/coreclr/blob/9499b08eefd895158c3f3c7834e185a73619128d/src/System.Private.CoreLib/shared/System/DateTimeOffset.cs#L286-L292

From everything I can find online (ISO8601, RFC3339, SQL Server doc), the offset supports the range -14 to 14 hours, and only supports minute precision.


In reply to: 212488658 [](ancestors = 212488658,211667357)

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks a lot! this is helpful. I'm now writing the ticks in minutes as short values because they are already validated when TimeSpan is created and when reading I convert the minutes back into Ticks when creating the TimeSpan object.


In reply to: 212670585 [](ancestors = 212670585,212488658,211667357)

return GetComparerOne<DvBool>(r1, r2, col, (x, y) => x.Equals(y));
case DataKind.TimeSpan:
return GetComparerOne<DvTimeSpan>(r1, r2, col, (x, y) => x.Equals(y));
return GetComparerOne<TimeSpan>(r1, r2, col, (x, y) => x.Ticks == y.Ticks);

@TomFinleyTomFinleyAug 22, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

TimeSpan [](start = 42, length = 8)

As near as I can see, both TimeSpan and DateTime are directly comparable, that might be better. #Resolved

//https://github.com/dotnet/coreclr/blob/9499b08eefd895158c3f3c7834e185a73619128d/src/System.Private.CoreLib/shared/System/DateTimeOffset.cs#L51-L53
//https://github.com/dotnet/coreclr/blob/9499b08eefd895158c3f3c7834e185a73619128d/src/System.Private.CoreLib/shared/System/DateTimeOffset.cs#L286-L292
//From everything online(ISO8601, RFC3339, SQL Server doc, the offset supports the range -14 to 14 hours, and only supports minute precision.
_offsets.Add((short)(value.Offset.Ticks / TimeSpan.TicksPerMinute));

@eerhardteerhardtAug 28, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why can't this just be value.TotalMinutes? #Resolved

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

don't see totalMinutes under value, did you mean under offset?


In reply to: 213152272 [](ancestors = 213152272)

@eerhardteerhardtAug 28, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, value.Offset.TotalMinutes #Resolved

{
Contracts.Assert(!_disposed);
value = new DvDateTimeZone(_ticks[_index], _offsets[_index]);
value = new DateTimeOffset(new DateTime(_ticks[_index]), new TimeSpan(_offsets[_index] * TimeSpan.TicksPerMinute));

@eerhardteerhardtAug 28, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

new TimeSpan(_offsets[_index] * TimeSpan.TicksPerMinute) should be new TimeSpan(0, _offsets[_index], 0) #Resolved

RegisterOtherCodec("DvDateTimeZone", new DateTimeOffsetCodec(this).GetCodec);
RegisterOtherCodec("DvDateTime", new DateTimeCodec(this).GetCodec);
RegisterOtherCodec("DvTimeSpan", new UnsafeTypeCodec<TimeSpan>(this).GetCodec);
RegisterOtherCodec("Key", GetKeyCodec);

@TomFinleyTomFinleyAug 28, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I see the new test helped show up some issues.

BTW where are we testing the writing of data into what amounts to a new format? #Resolved

@codemzscodemzsAug 28, 2018

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We have a test that reads from the old IDV format then it writes back as text and that is where writing of data into new format is tested. Also for date/time the serialization format has not changed. I believe it only changed for bools.


In reply to: 213349875 [](ancestors = 213349875)

@TomFinleyTomFinleyAug 29, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe a simple way to do this is modify your test a little bit.

Currently it is something like this.

TestCore("savedata",idvPath,"loader=binary","saver=text",textOutputPath.Arg("dout"));

If we modify it to be this:

varintermediateData=/// some temp IDV file.TestCore("savedata",idvPath,"loader=binary","saver=text",textOutputPath.Arg("dout"));TestCore("savedata",idvPath,"loader=binary","saver=binary",intermediateData.ArgOnly("dout"));TestCore("savedata",intermediateData,"loader=binary","saver=text",textOutputPath.Arg("dout"));

That will test everything. #Resolved

@shauheenshauheen added the enhancement New feature or request label Aug 28, 2018
@shauheenshauheen added this to the 0818 milestone Aug 28, 2018
@shauheenshauheen removed this from the 0818 milestone Aug 30, 2018
…to dvdatetime
# Conflicts:
#	test/BaselineOutput/SingleDebug/SavePipe/TestParquetPrimitiveDataTypes-Data.txt
#	test/BaselineOutput/SingleDebug/SavePipe/TestParquetPrimitiveDataTypes-Schema.txt
#	test/BaselineOutput/SingleRelease/SavePipe/TestParquetPrimitiveDataTypes-Data.txt
#	test/BaselineOutput/SingleRelease/SavePipe/TestParquetPrimitiveDataTypes-Schema.txt
#	test/data/Parquet/alltypes.parquet
@codemzs

Copy link
Copy Markdown
MemberAuthor

This change was committed via #863

@codemzscodemzs closed this Sep 20, 2018
@codemzs
codemzs deleted the dvdatetime branch September 20, 2018 18:16
@ghostghost locked as resolved and limited conversation to collaborators Mar 29, 2022
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

enhancementNew feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

.NET data type system instead of DvTypes

5 participants

@codemzs@TomFinley@Ivanidzo4ka@eerhardt@shauheen
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Replace DvDateTimeZone, DvDateTime, DvTimeSpan with .NET standard types. - #693

Closed
codemzs wants to merge 24 commits into
dotnet:masterfrom
codemzs:dvdatetime
Closed

Replace DvDateTimeZone, DvDateTime, DvTimeSpan with .NET standard types.#693
codemzs wants to merge 24 commits into
dotnet:masterfrom
codemzs:dvdatetime

Conversation

@codemzs

@codemzscodemzs commented Aug 19, 2018

Copy link
Copy Markdown
Member

fixes#673

@codemzs
codemzs requested review from Ivanidzo4ka, TomFinley, Zruty0, dotnet-bot and eerhardt and removed request for dotnet-botAugust 19, 2018 07:10
@codemzs

codemzs commented Aug 19, 2018

Copy link
Copy Markdown
MemberAuthor

@TomFinley@eerhardt Do we need missing value support for datetime, timespan, datetimeoffset? These are structs so may be use default as missing values? For now I have assumed there is no missing value indicator but I can add it back. #Resolved

RegisterSimpleCodec(new UnsafeTypeCodec<Single>(this));
RegisterSimpleCodec(new UnsafeTypeCodec<Double>(this));
RegisterSimpleCodec(new UnsafeTypeCodec<DvTimeSpan>(this));
RegisterSimpleCodec(new UnsafeTypeCodec<TimeSpan>(this));

@Ivanidzo4kaIvanidzo4kaAug 19, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

UnsafeTypeCodec [](start = 36, length = 15)

Is it still need to be UnsafeTypeCodec? #Resolved

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What should it be? I have defined TimeSpanUnsafeTypeOps to handle this type.


In reply to: 211110052 [](ancestors = 211110052)

@TomFinley

Copy link
Copy Markdown
Contributor

Hi @codemzs not sure I understand, are you proposing that the type for these structures be, for instance, not DateTime but DateTime? given that the default value for DataTime is not sensible?


In reply to: 414136160 [](ancestors = 414136160)

Comment threadsrc/Microsoft.ML/Data/TextLoader.cs Outdated
else if (type == typeof(DateTime))
kind = DataKind.DT;
else if (type == typeof(DvDateTimeZone) || type == typeof(TimeZoneInfo))
else if (type == typeof(DateTimeOffset) || type == typeof(TimeZoneInfo))

@TomFinleyTomFinleyAug 20, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

TimeZoneInfo [](start = 70, length = 12)

In what way does a TimeZoneInfo map into a DateTimeOffset? #Resolved

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I agree this seems totally wrong.


In reply to: 211315779 [](ancestors = 211315779)

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It was a miss, I did intend to remove it.


In reply to: 211662608 [](ancestors = 211662608,211315779)


/// <summary>
/// Whether this type is a DvDateTime.
/// Whether this type is a DateTime.

@TomFinleyTomFinleyAug 20, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

DateTime [](start = 35, length = 8)

<see tags perhaps #Resolved

@TomFinley

TomFinley commented Aug 20, 2018

Copy link
Copy Markdown
Contributor
 return true;

I know you didn't write this code but this if (...) return false; return true; type code is incredibly annoying to me...

Maybe:

Contracts.Assert((this==DateTimeType.Instance)==(thisisDateTimeType));returnthisis DateTimeType

Similar cleanup possible for the other Is properties here. #Resolved


Refers to: src/Microsoft.ML.Core/Data/ColumnType.cs:148 in e0d66b0. [](commit_id = e0d66b0, deletion_comment = False)

}
dst = DvDateTime.NA;

return IsStdMissing(ref src);

@TomFinleyTomFinleyAug 20, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

IsStdMissing(ref src); [](start = 19, length = 22)

So I feel like if you parse missing into a value type that does not support missing, we might expect the result to be that we would throw, rather than just the default value. #Resolved

}
dst = DvDateTimeZone.NA;

return IsStdMissing(ref src);

@TomFinleyTomFinleyAug 20, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

IsStdMissing [](start = 19, length = 12)

Similar for this. #Resolved

@TomFinley

TomFinley commented Aug 20, 2018

Copy link
Copy Markdown
Contributor

I might have expected to see some change where we take out DvDateTime, Dv... etc. Is it not so? #Resolved

private sealed class Writer : ValueWriterBase<DvDateTimeZone>
private sealed class Writer : ValueWriterBase<DateTimeOffset>
{
private List<short> _offsets;

@eerhardteerhardtAug 21, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not sure on how concerned we need to be with sizes, but an offset can only be in the range of -14 to 14 hours. So using a long seems like a bit of an overkill.

It also appears that previously the _offsets was the number of minutes in the offset. Now we are using the number of ticks in the offset. Do we need to be concerned with this difference? #Resolved

@codemzscodemzsAug 23, 2018

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

.NET standard type has offsets in ticks. We could convert offset in minutes when writing to disk and convert it back to ticks when reading but we may lose precision. What do you think?


In reply to: 211667357 [](ancestors = 211667357)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

DateTimeOffset exposes its offset as a TimeSpan, but internally it uses short and in minutes.

https://github.com/dotnet/coreclr/blob/9499b08eefd895158c3f3c7834e185a73619128d/src/System.Private.CoreLib/shared/System/DateTimeOffset.cs#L51-L53

https://github.com/dotnet/coreclr/blob/9499b08eefd895158c3f3c7834e185a73619128d/src/System.Private.CoreLib/shared/System/DateTimeOffset.cs#L286-L292

From everything I can find online (ISO8601, RFC3339, SQL Server doc), the offset supports the range -14 to 14 hours, and only supports minute precision.


In reply to: 212488658 [](ancestors = 212488658,211667357)

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks a lot! this is helpful. I'm now writing the ticks in minutes as short values because they are already validated when TimeSpan is created and when reading I convert the minutes back into Ticks when creating the TimeSpan object.


In reply to: 212670585 [](ancestors = 212670585,212488658,211667357)

return GetComparerOne<DvBool>(r1, r2, col, (x, y) => x.Equals(y));
case DataKind.TimeSpan:
return GetComparerOne<DvTimeSpan>(r1, r2, col, (x, y) => x.Equals(y));
return GetComparerOne<TimeSpan>(r1, r2, col, (x, y) => x.Ticks == y.Ticks);

@TomFinleyTomFinleyAug 22, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

TimeSpan [](start = 42, length = 8)

As near as I can see, both TimeSpan and DateTime are directly comparable, that might be better. #Resolved

//https://github.com/dotnet/coreclr/blob/9499b08eefd895158c3f3c7834e185a73619128d/src/System.Private.CoreLib/shared/System/DateTimeOffset.cs#L51-L53
//https://github.com/dotnet/coreclr/blob/9499b08eefd895158c3f3c7834e185a73619128d/src/System.Private.CoreLib/shared/System/DateTimeOffset.cs#L286-L292
//From everything online(ISO8601, RFC3339, SQL Server doc, the offset supports the range -14 to 14 hours, and only supports minute precision.
_offsets.Add((short)(value.Offset.Ticks / TimeSpan.TicksPerMinute));

@eerhardteerhardtAug 28, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why can't this just be value.TotalMinutes? #Resolved

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

don't see totalMinutes under value, did you mean under offset?


In reply to: 213152272 [](ancestors = 213152272)

@eerhardteerhardtAug 28, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, value.Offset.TotalMinutes #Resolved

{
Contracts.Assert(!_disposed);
value = new DvDateTimeZone(_ticks[_index], _offsets[_index]);
value = new DateTimeOffset(new DateTime(_ticks[_index]), new TimeSpan(_offsets[_index] * TimeSpan.TicksPerMinute));

@eerhardteerhardtAug 28, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

new TimeSpan(_offsets[_index] * TimeSpan.TicksPerMinute) should be new TimeSpan(0, _offsets[_index], 0) #Resolved

RegisterOtherCodec("DvDateTimeZone", new DateTimeOffsetCodec(this).GetCodec);
RegisterOtherCodec("DvDateTime", new DateTimeCodec(this).GetCodec);
RegisterOtherCodec("DvTimeSpan", new UnsafeTypeCodec<TimeSpan>(this).GetCodec);
RegisterOtherCodec("Key", GetKeyCodec);

@TomFinleyTomFinleyAug 28, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I see the new test helped show up some issues.

BTW where are we testing the writing of data into what amounts to a new format? #Resolved

@codemzscodemzsAug 28, 2018

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We have a test that reads from the old IDV format then it writes back as text and that is where writing of data into new format is tested. Also for date/time the serialization format has not changed. I believe it only changed for bools.


In reply to: 213349875 [](ancestors = 213349875)

@TomFinleyTomFinleyAug 29, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe a simple way to do this is modify your test a little bit.

Currently it is something like this.

TestCore("savedata",idvPath,"loader=binary","saver=text",textOutputPath.Arg("dout"));

If we modify it to be this:

varintermediateData=/// some temp IDV file.TestCore("savedata",idvPath,"loader=binary","saver=text",textOutputPath.Arg("dout"));TestCore("savedata",idvPath,"loader=binary","saver=binary",intermediateData.ArgOnly("dout"));TestCore("savedata",intermediateData,"loader=binary","saver=text",textOutputPath.Arg("dout"));

That will test everything. #Resolved

@shauheenshauheen added the enhancement New feature or request label Aug 28, 2018
@shauheenshauheen added this to the 0818 milestone Aug 28, 2018
@shauheenshauheen removed this from the 0818 milestone Aug 30, 2018
…to dvdatetime
# Conflicts:
#	test/BaselineOutput/SingleDebug/SavePipe/TestParquetPrimitiveDataTypes-Data.txt
#	test/BaselineOutput/SingleDebug/SavePipe/TestParquetPrimitiveDataTypes-Schema.txt
#	test/BaselineOutput/SingleRelease/SavePipe/TestParquetPrimitiveDataTypes-Data.txt
#	test/BaselineOutput/SingleRelease/SavePipe/TestParquetPrimitiveDataTypes-Schema.txt
#	test/data/Parquet/alltypes.parquet
@codemzs

Copy link
Copy Markdown
MemberAuthor

This change was committed via #863

@codemzscodemzs closed this Sep 20, 2018
@codemzs
codemzs deleted the dvdatetime branch September 20, 2018 18:16
@ghostghost locked as resolved and limited conversation to collaborators Mar 29, 2022
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

enhancementNew feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

.NET data type system instead of DvTypes

5 participants

@codemzs@TomFinley@Ivanidzo4ka@eerhardt@shauheen
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Replace DvDateTimeZone, DvDateTime, DvTimeSpan with .NET standard types. - #693

Closed
codemzs wants to merge 24 commits into
dotnet:masterfrom
codemzs:dvdatetime
Closed

Replace DvDateTimeZone, DvDateTime, DvTimeSpan with .NET standard types.#693
codemzs wants to merge 24 commits into
dotnet:masterfrom
codemzs:dvdatetime

Conversation

@codemzs

@codemzscodemzs commented Aug 19, 2018

Copy link
Copy Markdown
Member

fixes#673

@codemzs
codemzs requested review from Ivanidzo4ka, TomFinley, Zruty0, dotnet-bot and eerhardt and removed request for dotnet-botAugust 19, 2018 07:10
@codemzs

codemzs commented Aug 19, 2018

Copy link
Copy Markdown
MemberAuthor

@TomFinley@eerhardt Do we need missing value support for datetime, timespan, datetimeoffset? These are structs so may be use default as missing values? For now I have assumed there is no missing value indicator but I can add it back. #Resolved

RegisterSimpleCodec(new UnsafeTypeCodec<Single>(this));
RegisterSimpleCodec(new UnsafeTypeCodec<Double>(this));
RegisterSimpleCodec(new UnsafeTypeCodec<DvTimeSpan>(this));
RegisterSimpleCodec(new UnsafeTypeCodec<TimeSpan>(this));

@Ivanidzo4kaIvanidzo4kaAug 19, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

UnsafeTypeCodec [](start = 36, length = 15)

Is it still need to be UnsafeTypeCodec? #Resolved

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What should it be? I have defined TimeSpanUnsafeTypeOps to handle this type.


In reply to: 211110052 [](ancestors = 211110052)

@TomFinley

Copy link
Copy Markdown
Contributor

Hi @codemzs not sure I understand, are you proposing that the type for these structures be, for instance, not DateTime but DateTime? given that the default value for DataTime is not sensible?


In reply to: 414136160 [](ancestors = 414136160)

Comment threadsrc/Microsoft.ML/Data/TextLoader.cs Outdated
else if (type == typeof(DateTime))
kind = DataKind.DT;
else if (type == typeof(DvDateTimeZone) || type == typeof(TimeZoneInfo))
else if (type == typeof(DateTimeOffset) || type == typeof(TimeZoneInfo))

@TomFinleyTomFinleyAug 20, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

TimeZoneInfo [](start = 70, length = 12)

In what way does a TimeZoneInfo map into a DateTimeOffset? #Resolved

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I agree this seems totally wrong.


In reply to: 211315779 [](ancestors = 211315779)

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It was a miss, I did intend to remove it.


In reply to: 211662608 [](ancestors = 211662608,211315779)


/// <summary>
/// Whether this type is a DvDateTime.
/// Whether this type is a DateTime.

@TomFinleyTomFinleyAug 20, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

DateTime [](start = 35, length = 8)

<see tags perhaps #Resolved

@TomFinley

TomFinley commented Aug 20, 2018

Copy link
Copy Markdown
Contributor
 return true;

I know you didn't write this code but this if (...) return false; return true; type code is incredibly annoying to me...

Maybe:

Contracts.Assert((this==DateTimeType.Instance)==(thisisDateTimeType));returnthisis DateTimeType

Similar cleanup possible for the other Is properties here. #Resolved


Refers to: src/Microsoft.ML.Core/Data/ColumnType.cs:148 in e0d66b0. [](commit_id = e0d66b0, deletion_comment = False)

}
dst = DvDateTime.NA;

return IsStdMissing(ref src);

@TomFinleyTomFinleyAug 20, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

IsStdMissing(ref src); [](start = 19, length = 22)

So I feel like if you parse missing into a value type that does not support missing, we might expect the result to be that we would throw, rather than just the default value. #Resolved

}
dst = DvDateTimeZone.NA;

return IsStdMissing(ref src);

@TomFinleyTomFinleyAug 20, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

IsStdMissing [](start = 19, length = 12)

Similar for this. #Resolved

@TomFinley

TomFinley commented Aug 20, 2018

Copy link
Copy Markdown
Contributor

I might have expected to see some change where we take out DvDateTime, Dv... etc. Is it not so? #Resolved

private sealed class Writer : ValueWriterBase<DvDateTimeZone>
private sealed class Writer : ValueWriterBase<DateTimeOffset>
{
private List<short> _offsets;

@eerhardteerhardtAug 21, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not sure on how concerned we need to be with sizes, but an offset can only be in the range of -14 to 14 hours. So using a long seems like a bit of an overkill.

It also appears that previously the _offsets was the number of minutes in the offset. Now we are using the number of ticks in the offset. Do we need to be concerned with this difference? #Resolved

@codemzscodemzsAug 23, 2018

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

.NET standard type has offsets in ticks. We could convert offset in minutes when writing to disk and convert it back to ticks when reading but we may lose precision. What do you think?


In reply to: 211667357 [](ancestors = 211667357)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

DateTimeOffset exposes its offset as a TimeSpan, but internally it uses short and in minutes.

https://github.com/dotnet/coreclr/blob/9499b08eefd895158c3f3c7834e185a73619128d/src/System.Private.CoreLib/shared/System/DateTimeOffset.cs#L51-L53

https://github.com/dotnet/coreclr/blob/9499b08eefd895158c3f3c7834e185a73619128d/src/System.Private.CoreLib/shared/System/DateTimeOffset.cs#L286-L292

From everything I can find online (ISO8601, RFC3339, SQL Server doc), the offset supports the range -14 to 14 hours, and only supports minute precision.


In reply to: 212488658 [](ancestors = 212488658,211667357)

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks a lot! this is helpful. I'm now writing the ticks in minutes as short values because they are already validated when TimeSpan is created and when reading I convert the minutes back into Ticks when creating the TimeSpan object.


In reply to: 212670585 [](ancestors = 212670585,212488658,211667357)

return GetComparerOne<DvBool>(r1, r2, col, (x, y) => x.Equals(y));
case DataKind.TimeSpan:
return GetComparerOne<DvTimeSpan>(r1, r2, col, (x, y) => x.Equals(y));
return GetComparerOne<TimeSpan>(r1, r2, col, (x, y) => x.Ticks == y.Ticks);

@TomFinleyTomFinleyAug 22, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

TimeSpan [](start = 42, length = 8)

As near as I can see, both TimeSpan and DateTime are directly comparable, that might be better. #Resolved

//https://github.com/dotnet/coreclr/blob/9499b08eefd895158c3f3c7834e185a73619128d/src/System.Private.CoreLib/shared/System/DateTimeOffset.cs#L51-L53
//https://github.com/dotnet/coreclr/blob/9499b08eefd895158c3f3c7834e185a73619128d/src/System.Private.CoreLib/shared/System/DateTimeOffset.cs#L286-L292
//From everything online(ISO8601, RFC3339, SQL Server doc, the offset supports the range -14 to 14 hours, and only supports minute precision.
_offsets.Add((short)(value.Offset.Ticks / TimeSpan.TicksPerMinute));

@eerhardteerhardtAug 28, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why can't this just be value.TotalMinutes? #Resolved

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

don't see totalMinutes under value, did you mean under offset?


In reply to: 213152272 [](ancestors = 213152272)

@eerhardteerhardtAug 28, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, value.Offset.TotalMinutes #Resolved

{
Contracts.Assert(!_disposed);
value = new DvDateTimeZone(_ticks[_index], _offsets[_index]);
value = new DateTimeOffset(new DateTime(_ticks[_index]), new TimeSpan(_offsets[_index] * TimeSpan.TicksPerMinute));

@eerhardteerhardtAug 28, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

new TimeSpan(_offsets[_index] * TimeSpan.TicksPerMinute) should be new TimeSpan(0, _offsets[_index], 0) #Resolved

RegisterOtherCodec("DvDateTimeZone", new DateTimeOffsetCodec(this).GetCodec);
RegisterOtherCodec("DvDateTime", new DateTimeCodec(this).GetCodec);
RegisterOtherCodec("DvTimeSpan", new UnsafeTypeCodec<TimeSpan>(this).GetCodec);
RegisterOtherCodec("Key", GetKeyCodec);

@TomFinleyTomFinleyAug 28, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I see the new test helped show up some issues.

BTW where are we testing the writing of data into what amounts to a new format? #Resolved

@codemzscodemzsAug 28, 2018

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We have a test that reads from the old IDV format then it writes back as text and that is where writing of data into new format is tested. Also for date/time the serialization format has not changed. I believe it only changed for bools.


In reply to: 213349875 [](ancestors = 213349875)

@TomFinleyTomFinleyAug 29, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe a simple way to do this is modify your test a little bit.

Currently it is something like this.

TestCore("savedata",idvPath,"loader=binary","saver=text",textOutputPath.Arg("dout"));

If we modify it to be this:

varintermediateData=/// some temp IDV file.TestCore("savedata",idvPath,"loader=binary","saver=text",textOutputPath.Arg("dout"));TestCore("savedata",idvPath,"loader=binary","saver=binary",intermediateData.ArgOnly("dout"));TestCore("savedata",intermediateData,"loader=binary","saver=text",textOutputPath.Arg("dout"));

That will test everything. #Resolved

@shauheenshauheen added the enhancement New feature or request label Aug 28, 2018
@shauheenshauheen added this to the 0818 milestone Aug 28, 2018
@shauheenshauheen removed this from the 0818 milestone Aug 30, 2018
…to dvdatetime
# Conflicts:
#	test/BaselineOutput/SingleDebug/SavePipe/TestParquetPrimitiveDataTypes-Data.txt
#	test/BaselineOutput/SingleDebug/SavePipe/TestParquetPrimitiveDataTypes-Schema.txt
#	test/BaselineOutput/SingleRelease/SavePipe/TestParquetPrimitiveDataTypes-Data.txt
#	test/BaselineOutput/SingleRelease/SavePipe/TestParquetPrimitiveDataTypes-Schema.txt
#	test/data/Parquet/alltypes.parquet
@codemzs

Copy link
Copy Markdown
MemberAuthor

This change was committed via #863

@codemzscodemzs closed this Sep 20, 2018
@codemzs
codemzs deleted the dvdatetime branch September 20, 2018 18:16
@ghostghost locked as resolved and limited conversation to collaborators Mar 29, 2022
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

enhancementNew feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

.NET data type system instead of DvTypes

5 participants

@codemzs@TomFinley@Ivanidzo4ka@eerhardt@shauheen
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Replace DvDateTimeZone, DvDateTime, DvTimeSpan with .NET standard types. - #693

Closed
codemzs wants to merge 24 commits into
dotnet:masterfrom
codemzs:dvdatetime
Closed

Replace DvDateTimeZone, DvDateTime, DvTimeSpan with .NET standard types.#693
codemzs wants to merge 24 commits into
dotnet:masterfrom
codemzs:dvdatetime

Conversation

@codemzs

@codemzscodemzs commented Aug 19, 2018

Copy link
Copy Markdown
Member

fixes#673

@codemzs
codemzs requested review from Ivanidzo4ka, TomFinley, Zruty0, dotnet-bot and eerhardt and removed request for dotnet-botAugust 19, 2018 07:10
@codemzs

codemzs commented Aug 19, 2018

Copy link
Copy Markdown
MemberAuthor

@TomFinley@eerhardt Do we need missing value support for datetime, timespan, datetimeoffset? These are structs so may be use default as missing values? For now I have assumed there is no missing value indicator but I can add it back. #Resolved

RegisterSimpleCodec(new UnsafeTypeCodec<Single>(this));
RegisterSimpleCodec(new UnsafeTypeCodec<Double>(this));
RegisterSimpleCodec(new UnsafeTypeCodec<DvTimeSpan>(this));
RegisterSimpleCodec(new UnsafeTypeCodec<TimeSpan>(this));

@Ivanidzo4kaIvanidzo4kaAug 19, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

UnsafeTypeCodec [](start = 36, length = 15)

Is it still need to be UnsafeTypeCodec? #Resolved

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What should it be? I have defined TimeSpanUnsafeTypeOps to handle this type.


In reply to: 211110052 [](ancestors = 211110052)

@TomFinley

Copy link
Copy Markdown
Contributor

Hi @codemzs not sure I understand, are you proposing that the type for these structures be, for instance, not DateTime but DateTime? given that the default value for DataTime is not sensible?


In reply to: 414136160 [](ancestors = 414136160)

Comment threadsrc/Microsoft.ML/Data/TextLoader.cs Outdated
else if (type == typeof(DateTime))
kind = DataKind.DT;
else if (type == typeof(DvDateTimeZone) || type == typeof(TimeZoneInfo))
else if (type == typeof(DateTimeOffset) || type == typeof(TimeZoneInfo))

@TomFinleyTomFinleyAug 20, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

TimeZoneInfo [](start = 70, length = 12)

In what way does a TimeZoneInfo map into a DateTimeOffset? #Resolved

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I agree this seems totally wrong.


In reply to: 211315779 [](ancestors = 211315779)

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It was a miss, I did intend to remove it.


In reply to: 211662608 [](ancestors = 211662608,211315779)


/// <summary>
/// Whether this type is a DvDateTime.
/// Whether this type is a DateTime.

@TomFinleyTomFinleyAug 20, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

DateTime [](start = 35, length = 8)

<see tags perhaps #Resolved

@TomFinley

TomFinley commented Aug 20, 2018

Copy link
Copy Markdown
Contributor
 return true;

I know you didn't write this code but this if (...) return false; return true; type code is incredibly annoying to me...

Maybe:

Contracts.Assert((this==DateTimeType.Instance)==(thisisDateTimeType));returnthisis DateTimeType

Similar cleanup possible for the other Is properties here. #Resolved


Refers to: src/Microsoft.ML.Core/Data/ColumnType.cs:148 in e0d66b0. [](commit_id = e0d66b0, deletion_comment = False)

}
dst = DvDateTime.NA;

return IsStdMissing(ref src);

@TomFinleyTomFinleyAug 20, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

IsStdMissing(ref src); [](start = 19, length = 22)

So I feel like if you parse missing into a value type that does not support missing, we might expect the result to be that we would throw, rather than just the default value. #Resolved

}
dst = DvDateTimeZone.NA;

return IsStdMissing(ref src);

@TomFinleyTomFinleyAug 20, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

IsStdMissing [](start = 19, length = 12)

Similar for this. #Resolved

@TomFinley

TomFinley commented Aug 20, 2018

Copy link
Copy Markdown
Contributor

I might have expected to see some change where we take out DvDateTime, Dv... etc. Is it not so? #Resolved

private sealed class Writer : ValueWriterBase<DvDateTimeZone>
private sealed class Writer : ValueWriterBase<DateTimeOffset>
{
private List<short> _offsets;

@eerhardteerhardtAug 21, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not sure on how concerned we need to be with sizes, but an offset can only be in the range of -14 to 14 hours. So using a long seems like a bit of an overkill.

It also appears that previously the _offsets was the number of minutes in the offset. Now we are using the number of ticks in the offset. Do we need to be concerned with this difference? #Resolved

@codemzscodemzsAug 23, 2018

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

.NET standard type has offsets in ticks. We could convert offset in minutes when writing to disk and convert it back to ticks when reading but we may lose precision. What do you think?


In reply to: 211667357 [](ancestors = 211667357)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

DateTimeOffset exposes its offset as a TimeSpan, but internally it uses short and in minutes.

https://github.com/dotnet/coreclr/blob/9499b08eefd895158c3f3c7834e185a73619128d/src/System.Private.CoreLib/shared/System/DateTimeOffset.cs#L51-L53

https://github.com/dotnet/coreclr/blob/9499b08eefd895158c3f3c7834e185a73619128d/src/System.Private.CoreLib/shared/System/DateTimeOffset.cs#L286-L292

From everything I can find online (ISO8601, RFC3339, SQL Server doc), the offset supports the range -14 to 14 hours, and only supports minute precision.


In reply to: 212488658 [](ancestors = 212488658,211667357)

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks a lot! this is helpful. I'm now writing the ticks in minutes as short values because they are already validated when TimeSpan is created and when reading I convert the minutes back into Ticks when creating the TimeSpan object.


In reply to: 212670585 [](ancestors = 212670585,212488658,211667357)

return GetComparerOne<DvBool>(r1, r2, col, (x, y) => x.Equals(y));
case DataKind.TimeSpan:
return GetComparerOne<DvTimeSpan>(r1, r2, col, (x, y) => x.Equals(y));
return GetComparerOne<TimeSpan>(r1, r2, col, (x, y) => x.Ticks == y.Ticks);

@TomFinleyTomFinleyAug 22, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

TimeSpan [](start = 42, length = 8)

As near as I can see, both TimeSpan and DateTime are directly comparable, that might be better. #Resolved

//https://github.com/dotnet/coreclr/blob/9499b08eefd895158c3f3c7834e185a73619128d/src/System.Private.CoreLib/shared/System/DateTimeOffset.cs#L51-L53
//https://github.com/dotnet/coreclr/blob/9499b08eefd895158c3f3c7834e185a73619128d/src/System.Private.CoreLib/shared/System/DateTimeOffset.cs#L286-L292
//From everything online(ISO8601, RFC3339, SQL Server doc, the offset supports the range -14 to 14 hours, and only supports minute precision.
_offsets.Add((short)(value.Offset.Ticks / TimeSpan.TicksPerMinute));

@eerhardteerhardtAug 28, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why can't this just be value.TotalMinutes? #Resolved

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

don't see totalMinutes under value, did you mean under offset?


In reply to: 213152272 [](ancestors = 213152272)

@eerhardteerhardtAug 28, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, value.Offset.TotalMinutes #Resolved

{
Contracts.Assert(!_disposed);
value = new DvDateTimeZone(_ticks[_index], _offsets[_index]);
value = new DateTimeOffset(new DateTime(_ticks[_index]), new TimeSpan(_offsets[_index] * TimeSpan.TicksPerMinute));

@eerhardteerhardtAug 28, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

new TimeSpan(_offsets[_index] * TimeSpan.TicksPerMinute) should be new TimeSpan(0, _offsets[_index], 0) #Resolved

RegisterOtherCodec("DvDateTimeZone", new DateTimeOffsetCodec(this).GetCodec);
RegisterOtherCodec("DvDateTime", new DateTimeCodec(this).GetCodec);
RegisterOtherCodec("DvTimeSpan", new UnsafeTypeCodec<TimeSpan>(this).GetCodec);
RegisterOtherCodec("Key", GetKeyCodec);

@TomFinleyTomFinleyAug 28, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I see the new test helped show up some issues.

BTW where are we testing the writing of data into what amounts to a new format? #Resolved

@codemzscodemzsAug 28, 2018

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We have a test that reads from the old IDV format then it writes back as text and that is where writing of data into new format is tested. Also for date/time the serialization format has not changed. I believe it only changed for bools.


In reply to: 213349875 [](ancestors = 213349875)

@TomFinleyTomFinleyAug 29, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe a simple way to do this is modify your test a little bit.

Currently it is something like this.

TestCore("savedata",idvPath,"loader=binary","saver=text",textOutputPath.Arg("dout"));

If we modify it to be this:

varintermediateData=/// some temp IDV file.TestCore("savedata",idvPath,"loader=binary","saver=text",textOutputPath.Arg("dout"));TestCore("savedata",idvPath,"loader=binary","saver=binary",intermediateData.ArgOnly("dout"));TestCore("savedata",intermediateData,"loader=binary","saver=text",textOutputPath.Arg("dout"));

That will test everything. #Resolved

@shauheenshauheen added the enhancement New feature or request label Aug 28, 2018
@shauheenshauheen added this to the 0818 milestone Aug 28, 2018
@shauheenshauheen removed this from the 0818 milestone Aug 30, 2018
…to dvdatetime
# Conflicts:
#	test/BaselineOutput/SingleDebug/SavePipe/TestParquetPrimitiveDataTypes-Data.txt
#	test/BaselineOutput/SingleDebug/SavePipe/TestParquetPrimitiveDataTypes-Schema.txt
#	test/BaselineOutput/SingleRelease/SavePipe/TestParquetPrimitiveDataTypes-Data.txt
#	test/BaselineOutput/SingleRelease/SavePipe/TestParquetPrimitiveDataTypes-Schema.txt
#	test/data/Parquet/alltypes.parquet
@codemzs

Copy link
Copy Markdown
MemberAuthor

This change was committed via #863

@codemzscodemzs closed this Sep 20, 2018
@codemzs
codemzs deleted the dvdatetime branch September 20, 2018 18:16
@ghostghost locked as resolved and limited conversation to collaborators Mar 29, 2022
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

enhancementNew feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

.NET data type system instead of DvTypes

5 participants

@codemzs@TomFinley@Ivanidzo4ka@eerhardt@shauheen
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Replace DvDateTimeZone, DvDateTime, DvTimeSpan with .NET standard types. - #693

Closed
codemzs wants to merge 24 commits into
dotnet:masterfrom
codemzs:dvdatetime
Closed

Replace DvDateTimeZone, DvDateTime, DvTimeSpan with .NET standard types.#693
codemzs wants to merge 24 commits into
dotnet:masterfrom
codemzs:dvdatetime

Conversation

@codemzs

@codemzscodemzs commented Aug 19, 2018

Copy link
Copy Markdown
Member

fixes#673

@codemzs
codemzs requested review from Ivanidzo4ka, TomFinley, Zruty0, dotnet-bot and eerhardt and removed request for dotnet-botAugust 19, 2018 07:10
@codemzs

codemzs commented Aug 19, 2018

Copy link
Copy Markdown
MemberAuthor

@TomFinley@eerhardt Do we need missing value support for datetime, timespan, datetimeoffset? These are structs so may be use default as missing values? For now I have assumed there is no missing value indicator but I can add it back. #Resolved

RegisterSimpleCodec(new UnsafeTypeCodec<Single>(this));
RegisterSimpleCodec(new UnsafeTypeCodec<Double>(this));
RegisterSimpleCodec(new UnsafeTypeCodec<DvTimeSpan>(this));
RegisterSimpleCodec(new UnsafeTypeCodec<TimeSpan>(this));

@Ivanidzo4kaIvanidzo4kaAug 19, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

UnsafeTypeCodec [](start = 36, length = 15)

Is it still need to be UnsafeTypeCodec? #Resolved

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What should it be? I have defined TimeSpanUnsafeTypeOps to handle this type.


In reply to: 211110052 [](ancestors = 211110052)

@TomFinley

Copy link
Copy Markdown
Contributor

Hi @codemzs not sure I understand, are you proposing that the type for these structures be, for instance, not DateTime but DateTime? given that the default value for DataTime is not sensible?


In reply to: 414136160 [](ancestors = 414136160)

Comment threadsrc/Microsoft.ML/Data/TextLoader.cs Outdated
else if (type == typeof(DateTime))
kind = DataKind.DT;
else if (type == typeof(DvDateTimeZone) || type == typeof(TimeZoneInfo))
else if (type == typeof(DateTimeOffset) || type == typeof(TimeZoneInfo))

@TomFinleyTomFinleyAug 20, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

TimeZoneInfo [](start = 70, length = 12)

In what way does a TimeZoneInfo map into a DateTimeOffset? #Resolved

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I agree this seems totally wrong.


In reply to: 211315779 [](ancestors = 211315779)

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It was a miss, I did intend to remove it.


In reply to: 211662608 [](ancestors = 211662608,211315779)


/// <summary>
/// Whether this type is a DvDateTime.
/// Whether this type is a DateTime.

@TomFinleyTomFinleyAug 20, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

DateTime [](start = 35, length = 8)

<see tags perhaps #Resolved

@TomFinley

TomFinley commented Aug 20, 2018

Copy link
Copy Markdown
Contributor
 return true;

I know you didn't write this code but this if (...) return false; return true; type code is incredibly annoying to me...

Maybe:

Contracts.Assert((this==DateTimeType.Instance)==(thisisDateTimeType));returnthisis DateTimeType

Similar cleanup possible for the other Is properties here. #Resolved


Refers to: src/Microsoft.ML.Core/Data/ColumnType.cs:148 in e0d66b0. [](commit_id = e0d66b0, deletion_comment = False)

}
dst = DvDateTime.NA;

return IsStdMissing(ref src);

@TomFinleyTomFinleyAug 20, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

IsStdMissing(ref src); [](start = 19, length = 22)

So I feel like if you parse missing into a value type that does not support missing, we might expect the result to be that we would throw, rather than just the default value. #Resolved

}
dst = DvDateTimeZone.NA;

return IsStdMissing(ref src);

@TomFinleyTomFinleyAug 20, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

IsStdMissing [](start = 19, length = 12)

Similar for this. #Resolved

@TomFinley

TomFinley commented Aug 20, 2018

Copy link
Copy Markdown
Contributor

I might have expected to see some change where we take out DvDateTime, Dv... etc. Is it not so? #Resolved

private sealed class Writer : ValueWriterBase<DvDateTimeZone>
private sealed class Writer : ValueWriterBase<DateTimeOffset>
{
private List<short> _offsets;

@eerhardteerhardtAug 21, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not sure on how concerned we need to be with sizes, but an offset can only be in the range of -14 to 14 hours. So using a long seems like a bit of an overkill.

It also appears that previously the _offsets was the number of minutes in the offset. Now we are using the number of ticks in the offset. Do we need to be concerned with this difference? #Resolved

@codemzscodemzsAug 23, 2018

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

.NET standard type has offsets in ticks. We could convert offset in minutes when writing to disk and convert it back to ticks when reading but we may lose precision. What do you think?


In reply to: 211667357 [](ancestors = 211667357)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

DateTimeOffset exposes its offset as a TimeSpan, but internally it uses short and in minutes.

https://github.com/dotnet/coreclr/blob/9499b08eefd895158c3f3c7834e185a73619128d/src/System.Private.CoreLib/shared/System/DateTimeOffset.cs#L51-L53

https://github.com/dotnet/coreclr/blob/9499b08eefd895158c3f3c7834e185a73619128d/src/System.Private.CoreLib/shared/System/DateTimeOffset.cs#L286-L292

From everything I can find online (ISO8601, RFC3339, SQL Server doc), the offset supports the range -14 to 14 hours, and only supports minute precision.


In reply to: 212488658 [](ancestors = 212488658,211667357)

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks a lot! this is helpful. I'm now writing the ticks in minutes as short values because they are already validated when TimeSpan is created and when reading I convert the minutes back into Ticks when creating the TimeSpan object.


In reply to: 212670585 [](ancestors = 212670585,212488658,211667357)

return GetComparerOne<DvBool>(r1, r2, col, (x, y) => x.Equals(y));
case DataKind.TimeSpan:
return GetComparerOne<DvTimeSpan>(r1, r2, col, (x, y) => x.Equals(y));
return GetComparerOne<TimeSpan>(r1, r2, col, (x, y) => x.Ticks == y.Ticks);

@TomFinleyTomFinleyAug 22, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

TimeSpan [](start = 42, length = 8)

As near as I can see, both TimeSpan and DateTime are directly comparable, that might be better. #Resolved

//https://github.com/dotnet/coreclr/blob/9499b08eefd895158c3f3c7834e185a73619128d/src/System.Private.CoreLib/shared/System/DateTimeOffset.cs#L51-L53
//https://github.com/dotnet/coreclr/blob/9499b08eefd895158c3f3c7834e185a73619128d/src/System.Private.CoreLib/shared/System/DateTimeOffset.cs#L286-L292
//From everything online(ISO8601, RFC3339, SQL Server doc, the offset supports the range -14 to 14 hours, and only supports minute precision.
_offsets.Add((short)(value.Offset.Ticks / TimeSpan.TicksPerMinute));

@eerhardteerhardtAug 28, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why can't this just be value.TotalMinutes? #Resolved

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

don't see totalMinutes under value, did you mean under offset?


In reply to: 213152272 [](ancestors = 213152272)

@eerhardteerhardtAug 28, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, value.Offset.TotalMinutes #Resolved

{
Contracts.Assert(!_disposed);
value = new DvDateTimeZone(_ticks[_index], _offsets[_index]);
value = new DateTimeOffset(new DateTime(_ticks[_index]), new TimeSpan(_offsets[_index] * TimeSpan.TicksPerMinute));

@eerhardteerhardtAug 28, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

new TimeSpan(_offsets[_index] * TimeSpan.TicksPerMinute) should be new TimeSpan(0, _offsets[_index], 0) #Resolved

RegisterOtherCodec("DvDateTimeZone", new DateTimeOffsetCodec(this).GetCodec);
RegisterOtherCodec("DvDateTime", new DateTimeCodec(this).GetCodec);
RegisterOtherCodec("DvTimeSpan", new UnsafeTypeCodec<TimeSpan>(this).GetCodec);
RegisterOtherCodec("Key", GetKeyCodec);

@TomFinleyTomFinleyAug 28, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I see the new test helped show up some issues.

BTW where are we testing the writing of data into what amounts to a new format? #Resolved

@codemzscodemzsAug 28, 2018

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We have a test that reads from the old IDV format then it writes back as text and that is where writing of data into new format is tested. Also for date/time the serialization format has not changed. I believe it only changed for bools.


In reply to: 213349875 [](ancestors = 213349875)

@TomFinleyTomFinleyAug 29, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe a simple way to do this is modify your test a little bit.

Currently it is something like this.

TestCore("savedata",idvPath,"loader=binary","saver=text",textOutputPath.Arg("dout"));

If we modify it to be this:

varintermediateData=/// some temp IDV file.TestCore("savedata",idvPath,"loader=binary","saver=text",textOutputPath.Arg("dout"));TestCore("savedata",idvPath,"loader=binary","saver=binary",intermediateData.ArgOnly("dout"));TestCore("savedata",intermediateData,"loader=binary","saver=text",textOutputPath.Arg("dout"));

That will test everything. #Resolved

@shauheenshauheen added the enhancement New feature or request label Aug 28, 2018
@shauheenshauheen added this to the 0818 milestone Aug 28, 2018
@shauheenshauheen removed this from the 0818 milestone Aug 30, 2018
…to dvdatetime
# Conflicts:
#	test/BaselineOutput/SingleDebug/SavePipe/TestParquetPrimitiveDataTypes-Data.txt
#	test/BaselineOutput/SingleDebug/SavePipe/TestParquetPrimitiveDataTypes-Schema.txt
#	test/BaselineOutput/SingleRelease/SavePipe/TestParquetPrimitiveDataTypes-Data.txt
#	test/BaselineOutput/SingleRelease/SavePipe/TestParquetPrimitiveDataTypes-Schema.txt
#	test/data/Parquet/alltypes.parquet
@codemzs

Copy link
Copy Markdown
MemberAuthor

This change was committed via #863

@codemzscodemzs closed this Sep 20, 2018
@codemzs
codemzs deleted the dvdatetime branch September 20, 2018 18:16
@ghostghost locked as resolved and limited conversation to collaborators Mar 29, 2022
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

enhancementNew feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

.NET data type system instead of DvTypes

5 participants

@codemzs@TomFinley@Ivanidzo4ka@eerhardt@shauheen