Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
慢慢CG
TDengine
提交
d7579e02
T
TDengine
项目概览
慢慢CG
/
TDengine
与 Fork 源项目一致
Fork自
taosdata / TDengine
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
T
TDengine
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
d7579e02
编写于
8月 14, 2020
作者:
H
Haojun Liao
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
[td-225] fix the bugs in fill for interval query
上级
21f0afe5
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
97 addition
and
85 deletion
+97
-85
src/client/src/tscLocalMerge.c
src/client/src/tscLocalMerge.c
+75
-64
src/query/src/qFill.c
src/query/src/qFill.c
+22
-21
未找到文件。
src/client/src/tscLocalMerge.c
浏览文件 @
d7579e02
...
...
@@ -822,7 +822,7 @@ void adjustLoserTreeFromNewData(SLocalReducer *pLocalReducer, SLocalDataSource *
}
}
void
savePrevRecordAndSetup
Interpo
Info
(
SLocalReducer
*
pLocalReducer
,
SQueryInfo
*
pQueryInfo
,
SFillInfo
*
pFillInfo
)
{
void
savePrevRecordAndSetup
Fill
Info
(
SLocalReducer
*
pLocalReducer
,
SQueryInfo
*
pQueryInfo
,
SFillInfo
*
pFillInfo
)
{
// discard following dataset in the same group and reset the interpolation information
STableMetaInfo
*
pTableMetaInfo
=
tscGetMetaInfo
(
pQueryInfo
,
0
);
...
...
@@ -865,64 +865,66 @@ static void reversedCopyFromInterpolationToDstBuf(SQueryInfo *pQueryInfo, SSqlRe
}
}
/*
* Note: pRes->pLocalReducer may be null, due to the fact that "tscDestroyLocalReducer" is called
* by "interuptHandler" function in shell
*/
static
void
doFillResult
(
SSqlObj
*
pSql
,
SLocalReducer
*
pLocalReducer
,
bool
doneOutput
)
{
SSqlCmd
*
pCmd
=
&
pSql
->
cmd
;
SSqlRes
*
pRes
=
&
pSql
->
res
;
tFilePage
*
pFinalDataPage
=
pLocalReducer
->
pResultBuf
;
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfoDetail
(
pCmd
,
pCmd
->
clauseIndex
);
static
void
genFinalResWithoutFill
(
SSqlRes
*
pRes
,
SLocalReducer
*
pLocalReducer
,
SQueryInfo
*
pQueryInfo
)
{
assert
(
pQueryInfo
->
intervalTime
==
0
||
pQueryInfo
->
fillType
==
TSDB_FILL_NONE
);
// no interval query, no fill operation
if
(
pQueryInfo
->
intervalTime
==
0
||
pQueryInfo
->
fillType
==
TSDB_FILL_NONE
)
{
pRes
->
data
=
pLocalReducer
->
pFinalRes
;
pRes
->
numOfRows
=
pFinalDataPage
->
num
;
tFilePage
*
pBeforeFillData
=
pLocalReducer
->
pResultBuf
;
if
(
pQueryInfo
->
limit
.
offset
>
0
)
{
if
(
pQueryInfo
->
limit
.
offset
<
pRes
->
numOfRows
)
{
int32_t
prevSize
=
(
int32_t
)
pFinalDataPage
->
num
;
tColModelErase
(
pLocalReducer
->
resColModel
,
pFinalDataPage
,
prevSize
,
0
,
(
int32_t
)
pQueryInfo
->
limit
.
offset
-
1
);
pRes
->
data
=
pLocalReducer
->
pFinalRes
;
pRes
->
numOfRows
=
pBeforeFillData
->
num
;
/* remove the hole in column model */
tColModelCompact
(
pLocalReducer
->
resColModel
,
pFinalDataPage
,
prevSize
);
if
(
pQueryInfo
->
limit
.
offset
>
0
)
{
if
(
pQueryInfo
->
limit
.
offset
<
pRes
->
numOfRows
)
{
int32_t
prevSize
=
(
int32_t
)
pBeforeFillData
->
num
;
tColModelErase
(
pLocalReducer
->
resColModel
,
pBeforeFillData
,
prevSize
,
0
,
(
int32_t
)
pQueryInfo
->
limit
.
offset
-
1
);
pRes
->
numOfRows
-=
pQueryInfo
->
limit
.
offset
;
pQueryInfo
->
limit
.
offset
=
0
;
}
else
{
pQueryInfo
->
limit
.
offset
-=
pRes
->
numOfRows
;
pRes
->
numOfRows
=
0
;
}
/* remove the hole in column model */
tColModelCompact
(
pLocalReducer
->
resColModel
,
pBeforeFillData
,
prevSize
);
pRes
->
numOfRows
-=
pQueryInfo
->
limit
.
offset
;
pQueryInfo
->
limit
.
offset
=
0
;
}
else
{
pQueryInfo
->
limit
.
offset
-=
pRes
->
numOfRows
;
pRes
->
numOfRows
=
0
;
}
}
pRes
->
numOfRowsGroup
+=
pRes
->
numOfRows
;
pRes
->
numOfRowsGroup
+=
pRes
->
numOfRows
;
if
(
pQueryInfo
->
limit
.
limit
>=
0
&&
pRes
->
numOfRowsGroup
>
pQueryInfo
->
limit
.
limit
)
{
/* impose the limitation of output rows on the final result */
int32_t
prevSize
=
(
int32_t
)
pFinalDataPage
->
num
;
int32_t
overflow
=
(
int32_t
)(
pRes
->
numOfRowsGroup
-
pQueryInfo
->
limit
.
limit
);
assert
(
overflow
<
pRes
->
numOfRows
);
// impose the limitation of output rows on the final result
if
(
pQueryInfo
->
limit
.
limit
>=
0
&&
pRes
->
numOfRowsGroup
>
pQueryInfo
->
limit
.
limit
)
{
int32_t
prevSize
=
(
int32_t
)
pBeforeFillData
->
num
;
int32_t
overflow
=
(
int32_t
)(
pRes
->
numOfRowsGroup
-
pQueryInfo
->
limit
.
limit
);
assert
(
overflow
<
pRes
->
numOfRows
);
pRes
->
numOfRowsGroup
=
pQueryInfo
->
limit
.
limit
;
pRes
->
numOfRows
-=
overflow
;
pFinalDataPage
->
num
-=
overflow
;
pRes
->
numOfRowsGroup
=
pQueryInfo
->
limit
.
limit
;
pRes
->
numOfRows
-=
overflow
;
pBeforeFillData
->
num
-=
overflow
;
tColModelCompact
(
pLocalReducer
->
resColModel
,
pFinalDataPage
,
prevSize
);
tColModelCompact
(
pLocalReducer
->
resColModel
,
pBeforeFillData
,
prevSize
);
/* set remain data to be discarded, and reset the interpolation information */
savePrevRecordAndSetupInterpo
Info
(
pLocalReducer
,
pQueryInfo
,
pLocalReducer
->
pFillInfo
);
}
// set remain data to be discarded, and reset the interpolation information
savePrevRecordAndSetupFill
Info
(
pLocalReducer
,
pQueryInfo
,
pLocalReducer
->
pFillInfo
);
}
memcpy
(
pRes
->
data
,
pFinalDataPage
->
data
,
pRes
->
numOfRows
*
pLocalReducer
->
finalRowSize
);
memcpy
(
pRes
->
data
,
pBeforeFillData
->
data
,
pRes
->
numOfRows
*
pLocalReducer
->
finalRowSize
);
pRes
->
numOfClauseTotal
+=
pRes
->
numOfRows
;
pFinalDataPage
->
num
=
0
;
return
;
}
pRes
->
numOfClauseTotal
+=
pRes
->
numOfRows
;
pBeforeFillData
->
num
=
0
;
}
/*
* Note: pRes->pLocalReducer may be null, due to the fact that "tscDestroyLocalReducer" is called
* by "interuptHandler" function in shell
*/
static
void
doFillResult
(
SSqlObj
*
pSql
,
SLocalReducer
*
pLocalReducer
,
bool
doneOutput
)
{
SSqlCmd
*
pCmd
=
&
pSql
->
cmd
;
SSqlRes
*
pRes
=
&
pSql
->
res
;
tFilePage
*
pBeforeFillData
=
pLocalReducer
->
pResultBuf
;
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfoDetail
(
pCmd
,
pCmd
->
clauseIndex
);
SFillInfo
*
pFillInfo
=
pLocalReducer
->
pFillInfo
;
SFillInfo
*
pFillInfo
=
pLocalReducer
->
pFillInfo
;
int64_t
actualETime
=
MAX
(
pQueryInfo
->
window
.
skey
,
pQueryInfo
->
window
.
ekey
);
tFilePage
**
pResPages
=
malloc
(
POINTER_BYTES
*
pQueryInfo
->
fieldsInfo
.
numOfOutput
);
...
...
@@ -960,7 +962,7 @@ static void doFillResult(SSqlObj *pSql, SLocalReducer *pLocalReducer, bool doneO
break
;
}
/
* all output for current group are completed */
/
/ all output in current group are completed
int32_t
totalRemainRows
=
(
int32_t
)
getFilledNumOfRes
(
pFillInfo
,
actualETime
,
pLocalReducer
->
resColModel
->
capacity
);
if
(
totalRemainRows
<=
0
)
{
break
;
...
...
@@ -970,15 +972,16 @@ static void doFillResult(SSqlObj *pSql, SLocalReducer *pLocalReducer, bool doneO
}
if
(
pRes
->
numOfRows
>
0
)
{
if
(
pQueryInfo
->
limit
.
limit
>=
0
&&
pRes
->
numOfRows
>
pQueryInfo
->
limit
.
limit
)
{
int32_t
overflow
=
(
int32_t
)(
pRes
->
numOfRows
-
pQueryInfo
->
limit
.
limit
);
pRes
->
numOfRows
-=
overflow
;
pFinalDataPage
->
num
-=
overflow
;
int32_t
currentTotal
=
pRes
->
numOfRowsGroup
+
pRes
->
numOfRows
;
assert
(
pRes
->
numOfRows
>=
0
&&
pFinalDataPage
->
num
>
0
);
if
(
pQueryInfo
->
limit
.
limit
>=
0
&&
currentTotal
>
pQueryInfo
->
limit
.
limit
)
{
int32_t
overflow
=
(
int32_t
)(
currentTotal
-
pQueryInfo
->
limit
.
limit
);
pRes
->
numOfRows
-=
overflow
;
assert
(
pRes
->
numOfRows
>=
0
);
/* set remain data to be discarded, and reset the interpolation information */
savePrevRecordAndSetup
Interpo
Info
(
pLocalReducer
,
pQueryInfo
,
pFillInfo
);
savePrevRecordAndSetup
Fill
Info
(
pLocalReducer
,
pQueryInfo
,
pFillInfo
);
}
if
(
pQueryInfo
->
order
.
order
==
TSDB_ORDER_ASC
)
{
...
...
@@ -995,7 +998,7 @@ static void doFillResult(SSqlObj *pSql, SLocalReducer *pLocalReducer, bool doneO
pRes
->
numOfClauseTotal
+=
pRes
->
numOfRows
;
}
p
FinalDataPage
->
num
=
0
;
p
BeforeFillData
->
num
=
0
;
for
(
int32_t
i
=
0
;
i
<
pQueryInfo
->
fieldsInfo
.
numOfOutput
;
++
i
)
{
taosTFree
(
pResPages
[
i
]);
}
...
...
@@ -1212,7 +1215,7 @@ static bool saveGroupResultInfo(SSqlObj *pSql) {
* @param noMoreCurrentGroupRes
* @return if current group is skipped, return false, and do NOT record it into pRes->numOfGroups
*/
bool
doGenerate
FinalResults
(
SSqlObj
*
pSql
,
SLocalReducer
*
pLocalReducer
,
bool
noMoreCurrentGroupRes
)
{
bool
gen
FinalResults
(
SSqlObj
*
pSql
,
SLocalReducer
*
pLocalReducer
,
bool
noMoreCurrentGroupRes
)
{
SSqlCmd
*
pCmd
=
&
pSql
->
cmd
;
SSqlRes
*
pRes
=
&
pSql
->
res
;
...
...
@@ -1246,13 +1249,21 @@ bool doGenerateFinalResults(SSqlObj *pSql, SLocalReducer *pLocalReducer, bool no
// tColModelDisplay(pLocalReducer->resColModel, pLocalReducer->pBufForInterpo, pResBuf->num, pResBuf->num);
#endif
SFillInfo
*
pFillInfo
=
pLocalReducer
->
pFillInfo
;
if
(
pFillInfo
!=
NULL
)
{
taosFillSetStartInfo
(
pFillInfo
,
(
int32_t
)
pResBuf
->
num
,
pQueryInfo
->
window
.
ekey
);
taosFillCopyInputDataFromOneFilePage
(
pFillInfo
,
pResBuf
);
}
doFillResult
(
pSql
,
pLocalReducer
,
noMoreCurrentGroupRes
);
// no interval query, no fill operation
if
(
pQueryInfo
->
intervalTime
==
0
||
pQueryInfo
->
fillType
==
TSDB_FILL_NONE
)
{
genFinalResWithoutFill
(
pRes
,
pLocalReducer
,
pQueryInfo
);
}
else
{
SFillInfo
*
pFillInfo
=
pLocalReducer
->
pFillInfo
;
if
(
pFillInfo
!=
NULL
)
{
taosFillSetStartInfo
(
pFillInfo
,
(
int32_t
)
pResBuf
->
num
,
pQueryInfo
->
window
.
ekey
);
taosFillCopyInputDataFromOneFilePage
(
pFillInfo
,
pResBuf
);
}
doFillResult
(
pSql
,
pLocalReducer
,
noMoreCurrentGroupRes
);
}
return
true
;
}
...
...
@@ -1337,7 +1348,7 @@ static bool doHandleLastRemainData(SSqlObj *pSql) {
int64_t
etime
=
(
pQueryInfo
->
window
.
skey
<
pQueryInfo
->
window
.
ekey
)
?
pQueryInfo
->
window
.
ekey
:
pQueryInfo
->
window
.
skey
;
int32_t
rows
=
(
int32_t
)
getFilledNumOfRes
(
pFillInfo
,
etime
,
pLocalReducer
->
resColModel
->
capacity
);
if
(
rows
>
0
)
{
// do interpo
if
(
rows
>
0
)
{
doFillResult
(
pSql
,
pLocalReducer
,
true
);
}
}
...
...
@@ -1502,7 +1513,7 @@ int32_t tscDoLocalMerge(SSqlObj *pSql) {
*/
if
((
!
sameGroup
&&
pResBuf
->
num
>
0
)
||
(
pResBuf
->
num
==
pLocalReducer
->
resColModel
->
capacity
))
{
// does not belong to the same group
bool
notSkipped
=
doGenerate
FinalResults
(
pSql
,
pLocalReducer
,
!
sameGroup
);
bool
notSkipped
=
gen
FinalResults
(
pSql
,
pLocalReducer
,
!
sameGroup
);
// this row needs to discard, since it belongs to the group of previous
if
(
pLocalReducer
->
discard
&&
sameGroup
)
{
...
...
@@ -1571,7 +1582,7 @@ int32_t tscDoLocalMerge(SSqlObj *pSql) {
}
if
(
pLocalReducer
->
pResultBuf
->
num
)
{
doGenerate
FinalResults
(
pSql
,
pLocalReducer
,
true
);
gen
FinalResults
(
pSql
,
pLocalReducer
,
true
);
}
assert
(
pLocalReducer
->
status
==
TSC_LOCALREDUCE_IN_PROGRESS
&&
pRes
->
row
==
0
);
...
...
src/query/src/qFill.c
浏览文件 @
d7579e02
...
...
@@ -248,17 +248,17 @@ int taosDoLinearInterpolation(int32_t type, SPoint* point1, SPoint* point2, SPoi
return
0
;
}
static
void
setTagsValue
(
SFillInfo
*
p
ColInfo
,
tFilePage
**
data
,
SFillTagColInfo
*
pTags
,
int32_t
start
,
int32_t
num
)
{
for
(
int32_t
j
=
0
;
j
<
p
Co
lInfo
->
numOfCols
;
++
j
)
{
SFillColInfo
*
pCol
=
&
p
Co
lInfo
->
pFillCol
[
j
];
static
void
setTagsValue
(
SFillInfo
*
p
FillInfo
,
tFilePage
**
data
,
int32_t
num
)
{
for
(
int32_t
j
=
0
;
j
<
p
Fil
lInfo
->
numOfCols
;
++
j
)
{
SFillColInfo
*
pCol
=
&
p
Fil
lInfo
->
pFillCol
[
j
];
if
(
pCol
->
flag
==
TSDB_COL_NORMAL
)
{
continue
;
}
char
*
val1
=
elePtrAt
(
data
[
j
]
->
data
,
pCol
->
col
.
bytes
,
num
);
for
(
int32_t
i
=
0
;
i
<
p
Co
lInfo
->
numOfTags
;
++
i
)
{
SFillTagColInfo
*
pTag
=
&
p
Co
lInfo
->
pTags
[
i
];
for
(
int32_t
i
=
0
;
i
<
p
Fil
lInfo
->
numOfTags
;
++
i
)
{
SFillTagColInfo
*
pTag
=
&
p
Fil
lInfo
->
pTags
[
i
];
if
(
pTag
->
col
.
colId
==
pCol
->
col
.
colId
)
{
assignVal
(
val1
,
pTag
->
tagVal
,
pCol
->
col
.
bytes
,
pCol
->
col
.
type
);
break
;
...
...
@@ -267,8 +267,8 @@ static void setTagsValue(SFillInfo* pColInfo, tFilePage** data, SFillTagColInfo
}
}
static
void
doFillResultImpl
(
SFillInfo
*
pFillInfo
,
tFilePage
**
data
,
int32_t
*
num
,
char
**
srcData
,
int64_t
ts
,
SFillTagColInfo
*
pTags
,
bool
outOfBound
)
{
static
void
doFillResultImpl
(
SFillInfo
*
pFillInfo
,
tFilePage
**
data
,
int32_t
*
num
,
char
**
srcData
,
int64_t
ts
,
bool
outOfBound
)
{
char
*
prevValues
=
pFillInfo
->
prevValues
;
char
*
nextValues
=
pFillInfo
->
nextValues
;
...
...
@@ -312,7 +312,7 @@ static void doFillResultImpl(SFillInfo* pFillInfo, tFilePage** data, int32_t* nu
}
}
setTagsValue
(
pFillInfo
,
data
,
pTags
,
numOfValCols
,
*
num
);
setTagsValue
(
pFillInfo
,
data
,
*
num
);
}
else
if
(
pFillInfo
->
fillType
==
TSDB_FILL_LINEAR
)
{
// TODO : linear interpolation supports NULL value
if
(
prevValues
!=
NULL
&&
!
outOfBound
)
{
...
...
@@ -337,7 +337,7 @@ static void doFillResultImpl(SFillInfo* pFillInfo, tFilePage** data, int32_t* nu
taosDoLinearInterpolation
(
type
,
&
point1
,
&
point2
,
&
point
);
}
setTagsValue
(
pFillInfo
,
data
,
pTags
,
numOfValCols
,
*
num
);
setTagsValue
(
pFillInfo
,
data
,
*
num
);
}
else
{
for
(
int32_t
i
=
1
;
i
<
numOfValCols
;
++
i
)
{
...
...
@@ -352,7 +352,7 @@ static void doFillResultImpl(SFillInfo* pFillInfo, tFilePage** data, int32_t* nu
}
}
setTagsValue
(
pFillInfo
,
data
,
pTags
,
numOfValCols
,
*
num
);
setTagsValue
(
pFillInfo
,
data
,
*
num
);
}
}
else
{
/* fill the default value */
...
...
@@ -363,7 +363,7 @@ static void doFillResultImpl(SFillInfo* pFillInfo, tFilePage** data, int32_t* nu
assignVal
(
val1
,
(
char
*
)
&
pCol
->
fillVal
.
i
,
pCol
->
col
.
bytes
,
pCol
->
col
.
type
);
}
setTagsValue
(
pFillInfo
,
data
,
pTags
,
numOfValCols
,
*
num
);
setTagsValue
(
pFillInfo
,
data
,
*
num
);
}
pFillInfo
->
start
+=
(
pFillInfo
->
slidingTime
*
step
);
...
...
@@ -397,8 +397,6 @@ int32_t generateDataBlockImpl(SFillInfo* pFillInfo, tFilePage** data, int32_t nu
char
**
nextValues
=
&
pFillInfo
->
nextValues
;
int32_t
numOfTags
=
pFillInfo
->
numOfTags
;
SFillTagColInfo
*
pTags
=
pFillInfo
->
pTags
;
int32_t
step
=
GET_FORWARD_DIRECTION_FACTOR
(
pFillInfo
->
order
);
if
(
numOfRows
==
0
)
{
/*
...
...
@@ -406,7 +404,7 @@ int32_t generateDataBlockImpl(SFillInfo* pFillInfo, tFilePage** data, int32_t nu
* real result set. Note that we need to keep the direct previous result rows, to generated the filled data.
*/
while
(
num
<
outputRows
)
{
doFillResultImpl
(
pFillInfo
,
data
,
&
num
,
srcData
,
pFillInfo
->
start
,
pTags
,
true
);
doFillResultImpl
(
pFillInfo
,
data
,
&
num
,
srcData
,
pFillInfo
->
start
,
true
);
}
pFillInfo
->
numOfTotal
+=
pFillInfo
->
numOfCurrent
;
...
...
@@ -433,12 +431,11 @@ int32_t generateDataBlockImpl(SFillInfo* pFillInfo, tFilePage** data, int32_t nu
while
(((
pFillInfo
->
start
<
ts
&&
FILL_IS_ASC_FILL
(
pFillInfo
))
||
(
pFillInfo
->
start
>
ts
&&
!
FILL_IS_ASC_FILL
(
pFillInfo
)))
&&
num
<
outputRows
)
{
doFillResultImpl
(
pFillInfo
,
data
,
&
num
,
srcData
,
ts
,
pTags
,
false
);
doFillResultImpl
(
pFillInfo
,
data
,
&
num
,
srcData
,
ts
,
false
);
}
/* output buffer is full, abort */
if
((
num
==
outputRows
&&
FILL_IS_ASC_FILL
(
pFillInfo
))
||
(
num
<
0
&&
!
FILL_IS_ASC_FILL
(
pFillInfo
)))
{
if
((
num
==
outputRows
&&
FILL_IS_ASC_FILL
(
pFillInfo
))
||
(
num
<
0
&&
!
FILL_IS_ASC_FILL
(
pFillInfo
)))
{
pFillInfo
->
numOfTotal
+=
pFillInfo
->
numOfCurrent
;
return
outputRows
;
}
...
...
@@ -447,10 +444,12 @@ int32_t generateDataBlockImpl(SFillInfo* pFillInfo, tFilePage** data, int32_t nu
initBeforeAfterDataBuf
(
pFillInfo
,
prevValues
);
// assign rows to dst buffer
int32_t
i
=
0
;
for
(;
i
<
pFillInfo
->
numOfCols
-
numOfTags
;
++
i
)
{
for
(
int32_t
i
=
0
;
i
<
pFillInfo
->
numOfCols
;
++
i
)
{
SFillColInfo
*
pCol
=
&
pFillInfo
->
pFillCol
[
i
];
if
(
pCol
->
flag
==
TSDB_COL_TAG
)
{
continue
;
}
char
*
val1
=
elePtrAt
(
data
[
i
]
->
data
,
pCol
->
col
.
bytes
,
num
);
char
*
src
=
elePtrAt
(
srcData
[
i
],
pCol
->
col
.
bytes
,
pFillInfo
->
rowIdx
);
...
...
@@ -472,10 +471,12 @@ int32_t generateDataBlockImpl(SFillInfo* pFillInfo, tFilePage** data, int32_t nu
}
// set the tag value for final result
setTagsValue
(
pFillInfo
,
data
,
pTags
,
pFillInfo
->
numOfCols
-
numOfTags
,
num
);
setTagsValue
(
pFillInfo
,
data
,
num
);
pFillInfo
->
start
+=
(
pFillInfo
->
slidingTime
*
step
);
pFillInfo
->
rowIdx
+=
1
;
pFillInfo
->
numOfCurrent
+=
1
;
num
+=
1
;
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录