Skip to content

Commit

Permalink
#1092 Add validation interval in ingestion (#1263)
Browse files Browse the repository at this point in the history
  • Loading branch information
brandon-wonjune authored and alchan-lee committed Jan 17, 2019
1 parent b7ea7e2 commit a2f5cb2
Show file tree
Hide file tree
Showing 28 changed files with 957 additions and 330 deletions.
Expand Up @@ -26,7 +26,8 @@ export class InputMaskDirective {
private regexMap = {
number: '^[0-9]*$',
float: '^[+-]?([0-9]*[.])?[0-9]+$',
words: '([A-z]*\\s)*'
words: '([A-z]*\\s)*',
calendar: '^[0-9:\-\\s]*$'
};

@Input('input-mask')
Expand Down
Expand Up @@ -268,8 +268,13 @@ export class SchemaConfigComponent extends AbstractComponent {
public checkAndInitTimestampField(): void {
// set timestamp list
this._setTimestampFieldList();
// if selected field is timestamp field
if (this.timestampFieldList.every(field => field !== this.selectedTimestampField)) {
// if exist timestamp list, not selected timestamp field
if (this.timestampFieldList.length > 0 && !this.selectedTimestampField) {
// set selected timestamp field
this.selectedTimestampField = this.timestampFieldList[0];
// set FIELD timestamp type
this.selectedTimestampType = 'FIELD';
} else if (this.timestampFieldList.every(field => field !== this.selectedTimestampField)) { // if selected field is timestamp field
// set NULL selected timestamp field
this.selectedTimestampField = null;
// set CURRENT timestamp type
Expand Down Expand Up @@ -626,7 +631,9 @@ export class SchemaConfigComponent extends AbstractComponent {
// if changed timestamp field
return (this.selectedTimestampType !== this._sourceData.schemaData.selectedTimestampType) ||
this.selectedTimestampField &&
(this.selectedTimestampField.name !== this._sourceData.schemaData.selectedTimestampField.name || this.selectedTimestampField.format.type !== this._sourceData.schemaData.selectedTimestampField.format.type);
(this.selectedTimestampField.name !== this._sourceData.schemaData.selectedTimestampField.name
|| this.selectedTimestampField.format.type !== this._sourceData.schemaData.selectedTimestampField.format.type
|| this.selectedTimestampField.format.type === FieldFormatType.UNIX_TIME && this._sourceData.schemaData.selectedTimestampField.format.type === FieldFormatType.UNIX_TIME && this.selectedTimestampField.format.unit !== this._sourceData.schemaData.selectedTimestampField.format.unit);
} else { // if not exist schema data
return false;
}
Expand Down Expand Up @@ -696,6 +703,8 @@ export class SchemaConfigComponent extends AbstractComponent {
selectedRoleTypeFilter : this.selectedRoleTypeFilter,
// selected action
selectedAction: this.selectedAction,
// timestampFieldData
timestampFieldData: this.selectedTimestampType === 'FIELD' ? this._getFieldDataList(this.selectedTimestampField) : []
};
sourceData.schemaData = schemaData;
}
Expand Down
Expand Up @@ -73,6 +73,26 @@
<div class="ddp-wrap-hover-info ddp-type">
<em class="ddp-icon-info3"></em>
<!-- popup -->
<!--<div class="ddp-box-layout4 ddp-config">-->
<!--<div class="ddp-data-title">-->
<!--{{'msg.storage.ui.job.properties.description.title' | translate}}-->
<!--</div>-->
<!--<div class="ddp-data-det">-->
<!--{{'msg.storage.ui.job.properties.description' | translate}}-->
<!--<div class="ddp-link-det">-->
<!--<a target="_blank" rel="noopener noreferrer"-->
<!--class="ddp-hover-tooltip ddp-hover-underline"-->
<!--href="http://hadoop.apache.org/docs/stable/hadoop-mapreduce-client/hadoop-mapreduce-client-core/mapred-default.xml">-->
<!--{{'msg.storage.ui.job.properties.description.link' | translate}}-->
<!--<div class="ddp-ui-tooltip-info ddp-down" style="display:;">-->
<!--<em class="ddp-icon-view-top"></em>-->
<!--http://hadoop.apache.org/docs/stable/hadoop-mapreduce-client/hadoop-mapreduce-client-core/mapred-default.xml-->
<!--</div>-->
<!--</a>-->

<!--</div>-->
<!--</div>-->
<!--</div>-->
<div class="ddp-wrap-pop-setting">
<!-- popup -->
<div class="ddp-box-layout4 ddp-pop-setting">
Expand Down
Expand Up @@ -412,109 +412,106 @@
</div>
</div>
<!-- //Partition (staging) -->

<!-- Data range (staging) -->
<div class="ddp-ui-option-sub" *ngIf="createType === 'STAGING'">
<label class="ddp-ui-label-name">
{{'msg.storage.ui.dsource.create.data.range' | translate}}
</label>
<div class="ddp-ui-edit-option">
<div class="ddp-radio-set">
<label class="ddp-label-radio" (change)="onChangeDataRangeType(dataRangeTypeList[0])">
<input type="radio" [checked]="selectedDataRangeType.value === dataRangeTypeList[0].value">
<i class="ddp-icon-radio"></i>
<span class="ddp-txt-radio">{{dataRangeTypeList[0].label}}</span>
</label>
</div>
<div class="ddp-radio-hidden">
<label class="ddp-label-radio" (change)="onChangeDataRangeType(dataRangeTypeList[1])">
<input type="radio" [checked]="selectedDataRangeType.value === dataRangeTypeList[1].value">
<i class="ddp-icon-radio"></i>
<span class="ddp-txt-radio">{{dataRangeTypeList[1].label}}</span>
</label>
<!-- calen -->
<component-period
[isShowButtons]="false"
[defaultType]="'YEAR'"
[startDateDefault]="startDateTime"
[endDateDefault]="endDateTime"
(changeDate)="onChangeRangeTime($event)"
[disabled]="selectedDataRangeType.value === 'DISABLE'"
></component-period>
<!-- calen -->
</div>
</div>
</div>
<!-- //Data range (staging) -->

<!-- sub -->
<!-- Query granularity -->
<div class="ddp-ui-option-sub">
<label class="ddp-ui-label-name">
{{'msg.storage.th.segment.gran' | translate}}
{{'msg.storage.th.query.gran' | translate}}
<!-- info -->
<div class="ddp-wrap-hover-info ddp-type">
<em class="ddp-icon-info3"></em>
<!-- popup -->
<div class="ddp-box-layout4">
<div class="ddp-data-title">
{{'msg.storage.ui.segment-gran.title' | translate}}
{{'msg.storage.th.query.gran.title' | translate}}
</div>
<div class="ddp-data-det">
{{'msg.storage.ui.segment-gran.description' | translate}}
{{'msg.storage.th.query.gran.description' | translate}}
</div>
</div>
<!-- //popup -->
</div>
<!-- //info -->
</label>
<div class="ddp-type-selectbox ddp-setting" [class.ddp-selected]="isShowSegmentGranularityList"
(click)="isShowSegmentGranularityList = !isShowSegmentGranularityList"
(clickOutside)="isShowSegmentGranularityList=false">
<span class="ddp-txt-selectbox">{{selectedSegmentGranularity.label}}</span>
<div class="ddp-type-selectbox ddp-setting" [class.ddp-selected]="isShowQueryGranularityList"
(click)="isShowQueryGranularityList = !isShowQueryGranularityList"
(clickOutside)="isShowQueryGranularityList=false">
<span class="ddp-txt-selectbox">{{selectedQueryGranularity.label}}</span>
<ul class="ddp-list-selectbox ddp-selectdown">
<li *ngFor="let granularity of segmentGranularityList">
<a href="javascript:" (click)="onChangeSegmentGranularity(granularity)">
<li *ngFor="let granularity of queryGranularityList">
<a href="javascript:" (click)="onChangeQueryGranularity(granularity)">
{{granularity.label}}
</a>
</li>
</ul>
</div>
</div>
<!-- //sub -->
<!-- sub -->
<!-- //Query granularity -->
<!-- Segment granularity -->
<div class="ddp-ui-option-sub">
<label class="ddp-ui-label-name">
{{'msg.storage.th.query.gran' | translate}}
{{'msg.storage.th.segment.gran' | translate}}
<!-- info -->
<div class="ddp-wrap-hover-info ddp-type">
<em class="ddp-icon-info3"></em>
<!-- popup -->
<div class="ddp-box-layout4">
<div class="ddp-data-title">
{{'msg.storage.th.query.gran.title' | translate}}
{{'msg.storage.ui.segment-gran.title' | translate}}
</div>
<div class="ddp-data-det">
{{'msg.storage.th.query.gran.description' | translate}}
<div class="ddp-data-det" [innerHTML]="'msg.storage.ui.segment-gran.description' | translate">
</div>
</div>
<!-- //popup -->
</div>
<!-- //info -->
</label>
<div class="ddp-type-selectbox ddp-setting" [class.ddp-selected]="isShowQueryGranularityList"
(click)="isShowQueryGranularityList = !isShowQueryGranularityList"
(clickOutside)="isShowQueryGranularityList=false">
<span class="ddp-txt-selectbox">{{selectedQueryGranularity.label}}</span>
<div class="ddp-type-selectbox ddp-setting" [class.ddp-selected]="isShowSegmentGranularityList"
(click)="isShowSegmentGranularityList = !isShowSegmentGranularityList"
(clickOutside)="isShowSegmentGranularityList=false">
<span class="ddp-txt-selectbox">{{selectedSegmentGranularity.label}}</span>
<ul class="ddp-list-selectbox ddp-selectdown">
<li *ngFor="let granularity of queryGranularityList">
<a href="javascript:" (click)="onChangeQueryGranularity(granularity)">
<li *ngFor="let granularity of segmentGranularityList">
<a href="javascript:" (click)="onChangeSegmentGranularity(granularity)">
{{granularity.label}}
</a>
</li>
</ul>
</div>
</div>
<!-- //sub -->
<!-- //Segment granularity -->
<!-- Intervals -->
<div class="ddp-ui-option-sub" *ngIf="!isUsedCurrentTimestampColumn()">
<label class="ddp-ui-label-name">
{{'msg.storage.ui.intervals' | translate}}
</label>
<div class="ddp-ui-setting-table ddp-clear">

<div class="ddp-wrap-units">
<div class="ddp-ui-units">
<div class="ddp-ui-calen">
<!-- disabled 시 ddp-disabled 추가 -->
<div class="ddp-box-calen ">
<input type="text" class="ddp-input-typebasic ddp-data-calen" input-mask="calendar" (focusout)="checkStartInterval()" [(ngModel)]="startIntervalText">
</div>
<span class="ddp-bar">~</span>
<div class="ddp-box-calen ">
<input type="text" class="ddp-input-typebasic ddp-data-calen" input-mask="calendar" (focusout)="checkEndInterval()" [(ngModel)]="endIntervalText">
</div>
</div>
<!-- data -->
<div class="ddp-data-units">
<!-- error 일때 ddp-error-num 추가 -->
<span class="ddp-data-num" [class.ddp-error-num]="granularityUnit > 10000">{{granularityUnit | numberCommas}}</span> {{'msg.storage.ui.intervals.units' | translate}}
</div>
<!-- //data -->
</div>
<div class="ddp-txt-error ddp-clear"[class.ddp-default]="intervalValid">
<em class="ddp-icon-error-s"></em>{{intervalValid ? ('msg.storage.ui.intervals.valid.unit' | translate) : intervalValidMessage}}
</div>
</div>
</div>
</div>
<!-- //Intervals -->
</div>
<!-- //Timestamp settings -->
<!-- Roll up -->
Expand Down

0 comments on commit a2f5cb2

Please sign in to comment.