@finos/legend-application-data-cube 0.2.4 → 0.2.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (150) hide show
  1. package/README.md +1 -1
  2. package/lib/__lib__/LegendDataCubeNavigation.d.ts +9 -5
  3. package/lib/__lib__/LegendDataCubeNavigation.d.ts.map +1 -1
  4. package/lib/__lib__/LegendDataCubeNavigation.js +9 -5
  5. package/lib/__lib__/LegendDataCubeNavigation.js.map +1 -1
  6. package/lib/__lib__/LegendDataCubeUserData.d.ts +2 -2
  7. package/lib/__lib__/LegendDataCubeUserData.d.ts.map +1 -1
  8. package/lib/__lib__/LegendDataCubeUserData.js +2 -2
  9. package/lib/__lib__/LegendDataCubeUserData.js.map +1 -1
  10. package/lib/application/LegendDataCubeApplicationConfig.d.ts +4 -0
  11. package/lib/application/LegendDataCubeApplicationConfig.d.ts.map +1 -1
  12. package/lib/application/LegendDataCubeApplicationConfig.js +5 -0
  13. package/lib/application/LegendDataCubeApplicationConfig.js.map +1 -1
  14. package/lib/components/LegendDataCubeBlockingWindow.d.ts +29 -0
  15. package/lib/components/LegendDataCubeBlockingWindow.d.ts.map +1 -0
  16. package/lib/components/LegendDataCubeBlockingWindow.js +75 -0
  17. package/lib/components/LegendDataCubeBlockingWindow.js.map +1 -0
  18. package/lib/components/LegendDataCubeWebApplication.js +2 -2
  19. package/lib/components/LegendDataCubeWebApplication.js.map +1 -1
  20. package/lib/components/builder/LegendDataCubeBuilder.d.ts +20 -0
  21. package/lib/components/builder/LegendDataCubeBuilder.d.ts.map +1 -0
  22. package/lib/components/builder/LegendDataCubeBuilder.js +162 -0
  23. package/lib/components/builder/LegendDataCubeBuilder.js.map +1 -0
  24. package/lib/components/builder/LegendDataCubeBuilderStoreProvider.d.ts +19 -0
  25. package/lib/components/builder/LegendDataCubeBuilderStoreProvider.d.ts.map +1 -0
  26. package/lib/components/builder/LegendDataCubeBuilderStoreProvider.js +34 -0
  27. package/lib/components/builder/LegendDataCubeBuilderStoreProvider.js.map +1 -0
  28. package/lib/components/{query-builder/LegendDataCubeQuerySaver.d.ts → builder/LegendDataCubeCreator.d.ts} +2 -2
  29. package/lib/components/builder/LegendDataCubeCreator.d.ts.map +1 -0
  30. package/lib/components/{query-builder/LegendDataCubeNewQueryBuilder.js → builder/LegendDataCubeCreator.js} +10 -10
  31. package/lib/components/builder/LegendDataCubeCreator.js.map +1 -0
  32. package/lib/components/builder/LegendDataCubeDeleteConfirmation.d.ts +19 -0
  33. package/lib/components/builder/LegendDataCubeDeleteConfirmation.d.ts.map +1 -0
  34. package/lib/components/builder/LegendDataCubeDeleteConfirmation.js +43 -0
  35. package/lib/components/builder/LegendDataCubeDeleteConfirmation.js.map +1 -0
  36. package/lib/components/{query-builder/LegendDataCubeQueryLoader.d.ts → builder/LegendDataCubeLoader.d.ts} +2 -2
  37. package/lib/components/builder/LegendDataCubeLoader.d.ts.map +1 -0
  38. package/lib/components/builder/LegendDataCubeLoader.js +113 -0
  39. package/lib/components/builder/LegendDataCubeLoader.js.map +1 -0
  40. package/lib/components/{query-builder/LegendDataCubeNewQueryBuilder.d.ts → builder/LegendDataCubeSaver.d.ts} +2 -2
  41. package/lib/components/builder/LegendDataCubeSaver.d.ts.map +1 -0
  42. package/lib/components/builder/LegendDataCubeSaver.js +73 -0
  43. package/lib/components/builder/LegendDataCubeSaver.js.map +1 -0
  44. package/lib/components/{query-builder/LegendDataCubeQueryBuilder.d.ts → builder/LegendDataCubeSourceViewer.d.ts} +4 -2
  45. package/lib/components/builder/LegendDataCubeSourceViewer.d.ts.map +1 -0
  46. package/lib/components/builder/LegendDataCubeSourceViewer.js +46 -0
  47. package/lib/components/builder/LegendDataCubeSourceViewer.js.map +1 -0
  48. package/lib/components/{query-builder/source-builder → builder/source}/AdhocQueryDataCubeSourceBuilder.d.ts +1 -1
  49. package/lib/components/builder/source/AdhocQueryDataCubeSourceBuilder.d.ts.map +1 -0
  50. package/lib/components/builder/source/AdhocQueryDataCubeSourceBuilder.js.map +1 -0
  51. package/lib/components/{query-builder/source-builder → builder/source}/LegendQueryDataCubeSourceBuilder.d.ts +1 -1
  52. package/lib/components/builder/source/LegendQueryDataCubeSourceBuilder.d.ts.map +1 -0
  53. package/lib/components/{query-builder/source-builder → builder/source}/LegendQueryDataCubeSourceBuilder.js +13 -13
  54. package/lib/components/builder/source/LegendQueryDataCubeSourceBuilder.js.map +1 -0
  55. package/lib/index.css +1 -1
  56. package/lib/package.json +1 -1
  57. package/lib/stores/LegendDataCubeCacheManager.d.ts.map +1 -1
  58. package/lib/stores/LegendDataCubeCacheManager.js +11 -12
  59. package/lib/stores/LegendDataCubeCacheManager.js.map +1 -1
  60. package/lib/stores/LegendDataCubeDataCubeEngine.d.ts +1 -1
  61. package/lib/stores/LegendDataCubeDataCubeEngine.d.ts.map +1 -1
  62. package/lib/stores/LegendDataCubeDataCubeEngine.js +5 -11
  63. package/lib/stores/LegendDataCubeDataCubeEngine.js.map +1 -1
  64. package/lib/stores/builder/LegendDataCubeBuilderStore.d.ts +80 -0
  65. package/lib/stores/builder/LegendDataCubeBuilderStore.d.ts.map +1 -0
  66. package/lib/stores/builder/LegendDataCubeBuilderStore.js +353 -0
  67. package/lib/stores/builder/LegendDataCubeBuilderStore.js.map +1 -0
  68. package/lib/stores/{query-builder/LegendDataCubeNewQueryState.d.ts → builder/LegendDataCubeCreatorState.d.ts} +5 -5
  69. package/lib/stores/builder/LegendDataCubeCreatorState.d.ts.map +1 -0
  70. package/lib/stores/{query-builder/LegendDataCubeNewQueryState.js → builder/LegendDataCubeCreatorState.js} +17 -17
  71. package/lib/stores/builder/LegendDataCubeCreatorState.js.map +1 -0
  72. package/lib/stores/{query-builder/LegendDataCubeQueryLoaderState.d.ts → builder/LegendDataCubeLoaderState.d.ts} +20 -20
  73. package/lib/stores/builder/LegendDataCubeLoaderState.d.ts.map +1 -0
  74. package/lib/stores/builder/LegendDataCubeLoaderState.js +187 -0
  75. package/lib/stores/builder/LegendDataCubeLoaderState.js.map +1 -0
  76. package/lib/stores/builder/source/AdhocQueryDataCubeSourceBuilderState.d.ts.map +1 -0
  77. package/lib/stores/builder/source/AdhocQueryDataCubeSourceBuilderState.js.map +1 -0
  78. package/lib/stores/builder/source/LegendDataCubeSourceBuilderState.d.ts.map +1 -0
  79. package/lib/stores/{query-builder/source-builder → builder/source}/LegendDataCubeSourceBuilderState.js +1 -1
  80. package/lib/stores/builder/source/LegendDataCubeSourceBuilderState.js.map +1 -0
  81. package/lib/stores/builder/source/LegendQueryDataCubeSourceBuilderState.d.ts.map +1 -0
  82. package/lib/stores/builder/source/LegendQueryDataCubeSourceBuilderState.js.map +1 -0
  83. package/package.json +5 -5
  84. package/src/__lib__/LegendDataCubeNavigation.ts +15 -7
  85. package/src/__lib__/LegendDataCubeUserData.ts +2 -2
  86. package/src/application/LegendDataCubeApplicationConfig.ts +12 -0
  87. package/src/components/LegendDataCubeBlockingWindow.tsx +120 -0
  88. package/src/components/LegendDataCubeWebApplication.tsx +3 -3
  89. package/src/components/builder/LegendDataCubeBuilder.tsx +331 -0
  90. package/src/components/{query-builder/LegendDataCubeQueryBuilderStoreProvider.tsx → builder/LegendDataCubeBuilderStoreProvider.tsx} +19 -16
  91. package/src/components/{query-builder/LegendDataCubeNewQueryBuilder.tsx → builder/LegendDataCubeCreator.tsx} +9 -9
  92. package/src/components/builder/LegendDataCubeDeleteConfirmation.tsx +87 -0
  93. package/src/components/{query-builder/LegendDataCubeQueryLoader.tsx → builder/LegendDataCubeLoader.tsx} +122 -59
  94. package/src/components/builder/LegendDataCubeSaver.tsx +184 -0
  95. package/src/components/builder/LegendDataCubeSourceViewer.tsx +108 -0
  96. package/src/components/{query-builder/source-builder → builder/source}/AdhocQueryDataCubeSourceBuilder.tsx +1 -1
  97. package/src/components/{query-builder/source-builder → builder/source}/LegendQueryDataCubeSourceBuilder.tsx +16 -15
  98. package/src/stores/LegendDataCubeCacheManager.ts +11 -12
  99. package/src/stores/LegendDataCubeDataCubeEngine.ts +4 -14
  100. package/src/stores/builder/LegendDataCubeBuilderStore.tsx +516 -0
  101. package/src/stores/{query-builder/LegendDataCubeNewQueryState.tsx → builder/LegendDataCubeCreatorState.tsx} +23 -21
  102. package/src/stores/builder/LegendDataCubeLoaderState.tsx +248 -0
  103. package/src/stores/{query-builder/source-builder → builder/source}/LegendDataCubeSourceBuilderState.ts +1 -1
  104. package/tsconfig.json +16 -13
  105. package/lib/components/query-builder/LegendDataCubeNewQueryBuilder.d.ts.map +0 -1
  106. package/lib/components/query-builder/LegendDataCubeNewQueryBuilder.js.map +0 -1
  107. package/lib/components/query-builder/LegendDataCubeQueryBuilder.d.ts.map +0 -1
  108. package/lib/components/query-builder/LegendDataCubeQueryBuilder.js +0 -93
  109. package/lib/components/query-builder/LegendDataCubeQueryBuilder.js.map +0 -1
  110. package/lib/components/query-builder/LegendDataCubeQueryBuilderStoreProvider.d.ts +0 -19
  111. package/lib/components/query-builder/LegendDataCubeQueryBuilderStoreProvider.d.ts.map +0 -1
  112. package/lib/components/query-builder/LegendDataCubeQueryBuilderStoreProvider.js +0 -33
  113. package/lib/components/query-builder/LegendDataCubeQueryBuilderStoreProvider.js.map +0 -1
  114. package/lib/components/query-builder/LegendDataCubeQueryLoader.d.ts.map +0 -1
  115. package/lib/components/query-builder/LegendDataCubeQueryLoader.js +0 -97
  116. package/lib/components/query-builder/LegendDataCubeQueryLoader.js.map +0 -1
  117. package/lib/components/query-builder/LegendDataCubeQuerySaver.d.ts.map +0 -1
  118. package/lib/components/query-builder/LegendDataCubeQuerySaver.js +0 -51
  119. package/lib/components/query-builder/LegendDataCubeQuerySaver.js.map +0 -1
  120. package/lib/components/query-builder/source-builder/AdhocQueryDataCubeSourceBuilder.d.ts.map +0 -1
  121. package/lib/components/query-builder/source-builder/AdhocQueryDataCubeSourceBuilder.js.map +0 -1
  122. package/lib/components/query-builder/source-builder/LegendQueryDataCubeSourceBuilder.d.ts.map +0 -1
  123. package/lib/components/query-builder/source-builder/LegendQueryDataCubeSourceBuilder.js.map +0 -1
  124. package/lib/stores/query-builder/LegendDataCubeNewQueryState.d.ts.map +0 -1
  125. package/lib/stores/query-builder/LegendDataCubeNewQueryState.js.map +0 -1
  126. package/lib/stores/query-builder/LegendDataCubeQueryBuilderStore.d.ts +0 -58
  127. package/lib/stores/query-builder/LegendDataCubeQueryBuilderStore.d.ts.map +0 -1
  128. package/lib/stores/query-builder/LegendDataCubeQueryBuilderStore.js +0 -228
  129. package/lib/stores/query-builder/LegendDataCubeQueryBuilderStore.js.map +0 -1
  130. package/lib/stores/query-builder/LegendDataCubeQueryLoaderState.d.ts.map +0 -1
  131. package/lib/stores/query-builder/LegendDataCubeQueryLoaderState.js +0 -198
  132. package/lib/stores/query-builder/LegendDataCubeQueryLoaderState.js.map +0 -1
  133. package/lib/stores/query-builder/source-builder/AdhocQueryDataCubeSourceBuilderState.d.ts.map +0 -1
  134. package/lib/stores/query-builder/source-builder/AdhocQueryDataCubeSourceBuilderState.js.map +0 -1
  135. package/lib/stores/query-builder/source-builder/LegendDataCubeSourceBuilderState.d.ts.map +0 -1
  136. package/lib/stores/query-builder/source-builder/LegendDataCubeSourceBuilderState.js.map +0 -1
  137. package/lib/stores/query-builder/source-builder/LegendQueryDataCubeSourceBuilderState.d.ts.map +0 -1
  138. package/lib/stores/query-builder/source-builder/LegendQueryDataCubeSourceBuilderState.js.map +0 -1
  139. package/src/components/query-builder/LegendDataCubeQueryBuilder.tsx +0 -164
  140. package/src/components/query-builder/LegendDataCubeQuerySaver.tsx +0 -116
  141. package/src/stores/query-builder/LegendDataCubeQueryBuilderStore.tsx +0 -323
  142. package/src/stores/query-builder/LegendDataCubeQueryLoaderState.tsx +0 -260
  143. /package/lib/components/{query-builder/source-builder → builder/source}/AdhocQueryDataCubeSourceBuilder.js +0 -0
  144. /package/lib/stores/{query-builder/source-builder → builder/source}/AdhocQueryDataCubeSourceBuilderState.d.ts +0 -0
  145. /package/lib/stores/{query-builder/source-builder → builder/source}/AdhocQueryDataCubeSourceBuilderState.js +0 -0
  146. /package/lib/stores/{query-builder/source-builder → builder/source}/LegendDataCubeSourceBuilderState.d.ts +0 -0
  147. /package/lib/stores/{query-builder/source-builder → builder/source}/LegendQueryDataCubeSourceBuilderState.d.ts +0 -0
  148. /package/lib/stores/{query-builder/source-builder → builder/source}/LegendQueryDataCubeSourceBuilderState.js +0 -0
  149. /package/src/stores/{query-builder/source-builder → builder/source}/AdhocQueryDataCubeSourceBuilderState.ts +0 -0
  150. /package/src/stores/{query-builder/source-builder → builder/source}/LegendQueryDataCubeSourceBuilderState.ts +0 -0
@@ -20,7 +20,7 @@ import {
20
20
  SORT_BY_OPTIONS,
21
21
  type QueryLoaderState,
22
22
  } from '@finos/legend-query-builder';
23
- import type { LegendQueryDataCubeSourceBuilderState } from '../../../stores/query-builder/source-builder/LegendQueryDataCubeSourceBuilderState.js';
23
+ import type { LegendQueryDataCubeSourceBuilderState } from '../../../stores/builder/source/LegendQueryDataCubeSourceBuilderState.js';
24
24
  import { generateGAVCoordinates } from '@finos/legend-storage';
25
25
  import { cn, DataCubeIcon, useDropdownMenu } from '@finos/legend-art';
26
26
  import {
@@ -40,12 +40,12 @@ import {
40
40
  FormTextInput,
41
41
  } from '@finos/legend-data-cube';
42
42
  import { CODE_EDITOR_LANGUAGE } from '@finos/legend-code-editor';
43
- import { useLegendDataCubeQueryBuilderStore } from '../LegendDataCubeQueryBuilderStoreProvider.js';
43
+ import { useLegendDataCubeBuilderStore } from '../LegendDataCubeBuilderStoreProvider.js';
44
44
  import { useApplicationStore } from '@finos/legend-application';
45
45
 
46
46
  const LegendQuerySearcher = observer((props: { state: QueryLoaderState }) => {
47
47
  const { state } = props;
48
- const store = useLegendDataCubeQueryBuilderStore();
48
+ const store = useLegendDataCubeBuilderStore();
49
49
  const searchInputRef = useRef<HTMLInputElement>(null);
50
50
  const searchResults = state.queries;
51
51
 
@@ -54,7 +54,7 @@ const LegendQuerySearcher = observer((props: { state: QueryLoaderState }) => {
54
54
  }, [state]);
55
55
 
56
56
  // search text
57
- const debouncedLoadQueries = useMemo(
57
+ const debouncedLoader = useMemo(
58
58
  () =>
59
59
  debounce((input: string) => {
60
60
  flowResult(state.searchQueries(input)).catch((error) =>
@@ -68,14 +68,14 @@ const LegendQuerySearcher = observer((props: { state: QueryLoaderState }) => {
68
68
  ) => {
69
69
  if (event.target.value !== state.searchText) {
70
70
  state.setSearchText(event.target.value);
71
- debouncedLoadQueries.cancel();
72
- debouncedLoadQueries(event.target.value);
71
+ debouncedLoader.cancel();
72
+ debouncedLoader(event.target.value);
73
73
  }
74
74
  };
75
75
  const clearSearches = () => {
76
76
  state.setSearchText('');
77
- debouncedLoadQueries.cancel();
78
- debouncedLoadQueries('');
77
+ debouncedLoader.cancel();
78
+ debouncedLoader('');
79
79
  };
80
80
 
81
81
  // filter and sort
@@ -83,8 +83,8 @@ const LegendQuerySearcher = observer((props: { state: QueryLoaderState }) => {
83
83
  const toggleShowCurrentUserQueriesOnly = () => {
84
84
  state.setShowCurrentUserQueriesOnly(!state.showCurrentUserQueriesOnly);
85
85
  setIsMineOnly(!isMineOnly);
86
- debouncedLoadQueries.cancel();
87
- debouncedLoadQueries(state.searchText);
86
+ debouncedLoader.cancel();
87
+ debouncedLoader(state.searchText);
88
88
  };
89
89
 
90
90
  const [
@@ -95,8 +95,8 @@ const LegendQuerySearcher = observer((props: { state: QueryLoaderState }) => {
95
95
  ] = useDropdownMenu();
96
96
  const applySort = (value: SORT_BY_OPTIONS) => {
97
97
  state.setSortBy(value);
98
- debouncedLoadQueries.cancel();
99
- debouncedLoadQueries(state.searchText);
98
+ debouncedLoader.cancel();
99
+ debouncedLoader(state.searchText);
100
100
  };
101
101
 
102
102
  useEffect(() => {
@@ -254,7 +254,7 @@ export const LegendQueryDataCubeSourceBuilder = observer(
254
254
  (props: { sourceBuilder: LegendQueryDataCubeSourceBuilderState }) => {
255
255
  const { sourceBuilder } = props;
256
256
  const application = useApplicationStore();
257
- const store = useLegendDataCubeQueryBuilderStore();
257
+ const store = useLegendDataCubeBuilderStore();
258
258
  const query = sourceBuilder.query;
259
259
 
260
260
  if (!query) {
@@ -320,10 +320,11 @@ export const LegendQueryDataCubeSourceBuilder = observer(
320
320
  </div>
321
321
  )}
322
322
  <FormButton
323
- className="mt-1.5"
323
+ className="mt-1.5 flex items-center pl-1"
324
324
  onClick={() => sourceBuilder.unsetQuery()}
325
325
  >
326
- Select Another Query
326
+ <DataCubeIcon.ChevronLeft className="mr-0.5" />
327
+ Go Back
327
328
  </FormButton>
328
329
  </div>
329
330
  );
@@ -96,21 +96,15 @@ export class LegendDataCubeDataCubeCacheManager {
96
96
  let colType: string;
97
97
  switch (col.type as string) {
98
98
  case PRIMITIVE_TYPE.BOOLEAN: {
99
- colType = 'BOOLEAN';
100
- break;
101
- }
102
- case PRIMITIVE_TYPE.NUMBER: {
103
- colType = 'DOUBLE';
99
+ colType = 'BIT';
104
100
  break;
105
101
  }
106
102
  case PRIMITIVE_TYPE.INTEGER: {
107
- colType = 'FLOAT';
108
- break;
109
- }
110
- case PRIMITIVE_TYPE.DECIMAL: {
111
- colType = 'DECIMAL';
103
+ colType = 'INTEGER';
112
104
  break;
113
105
  }
106
+ case PRIMITIVE_TYPE.NUMBER:
107
+ case PRIMITIVE_TYPE.DECIMAL:
114
108
  case PRIMITIVE_TYPE.FLOAT: {
115
109
  colType = 'FLOAT';
116
110
  break;
@@ -119,7 +113,7 @@ export class LegendDataCubeDataCubeCacheManager {
119
113
  case PRIMITIVE_TYPE.STRICTDATE:
120
114
  case PRIMITIVE_TYPE.DATETIME:
121
115
  case PRIMITIVE_TYPE.DATE: {
122
- colType = 'STRING';
116
+ colType = 'VARCHAR';
123
117
  break;
124
118
  }
125
119
  case PRIMITIVE_TYPE.STRING: {
@@ -170,7 +164,12 @@ export class LegendDataCubeDataCubeCacheManager {
170
164
  const rows = data.map((row) => {
171
165
  const tdsRow = new TDSRow();
172
166
  tdsRow.values = columnNames.map(
173
- (column) => row[column] as string | number | boolean | null,
167
+ (column) =>
168
+ // NOTE: DuckDB WASM returns ArrayBuffer for numeric value, such as for count(*)
169
+ // so we need to convert it to number
170
+ (ArrayBuffer.isView(row[column])
171
+ ? row[column].valueOf()
172
+ : row[column]) as string | number | boolean | null,
174
173
  );
175
174
  return tdsRow;
176
175
  });
@@ -53,7 +53,6 @@ import {
53
53
  V1_Column,
54
54
  V1_Database,
55
55
  V1_Date,
56
- V1_Double,
57
56
  V1_DuckDBDatasourceSpecification,
58
57
  V1_EngineRuntime,
59
58
  V1_IdentifiedConnection,
@@ -69,7 +68,6 @@ import {
69
68
  V1_TestAuthenticationStrategy,
70
69
  V1_VarChar,
71
70
  V1_Bit,
72
- V1_Decimal,
73
71
  V1_Float,
74
72
  PackageableElementPointerType,
75
73
  DatabaseType,
@@ -151,9 +149,7 @@ export class LegendDataCubeDataCubeEngine extends DataCubeEngine {
151
149
 
152
150
  // ---------------------------------- IMPLEMENTATION ----------------------------------
153
151
 
154
- override async processQuerySource(
155
- value: PlainObject,
156
- ): Promise<DataCubeSource> {
152
+ override async processSource(value: PlainObject): Promise<DataCubeSource> {
157
153
  switch (value._type) {
158
154
  case ADHOC_QUERY_DATA_CUBE_SOURCE_TYPE: {
159
155
  const rawSource =
@@ -543,20 +539,14 @@ export class LegendDataCubeDataCubeEngine extends DataCubeEngine {
543
539
  column.type = new V1_Bit();
544
540
  break;
545
541
  }
546
- case PRIMITIVE_TYPE.NUMBER: {
547
- column.type = new V1_Double();
548
- break;
549
- }
550
542
  case PRIMITIVE_TYPE.INTEGER: {
551
543
  column.type = new V1_Integer();
552
544
  break;
553
545
  }
554
- case PRIMITIVE_TYPE.FLOAT: {
555
- column.type = new V1_Float();
556
- break;
557
- }
546
+ case PRIMITIVE_TYPE.NUMBER:
547
+ case PRIMITIVE_TYPE.FLOAT:
558
548
  case PRIMITIVE_TYPE.DECIMAL: {
559
- column.type = new V1_Decimal();
549
+ column.type = new V1_Float();
560
550
  break;
561
551
  }
562
552
  case PRIMITIVE_TYPE.DATE: