Skip to content
项目
群组
代码片段
帮助
正在加载...
帮助
为 GitLab 提交贡献
登录/注册
切换导航
H
h2database
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分枝图
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
计划
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
分枝图
统计图
创建新议题
作业
提交
议题看板
打开侧边栏
Administrator
h2database
Commits
deb43030
提交
deb43030
authored
6 年前
作者:
Evgenij Ryazanov
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Remove tricks for distinct operations on non-distinct external results
上级
acd95c24
显示空白字符变更
内嵌
并排
正在显示
3 个修改的文件
包含
47 行增加
和
110 行删除
+47
-110
MVPlainTempResult.java
h2/src/main/org/h2/mvstore/db/MVPlainTempResult.java
+2
-42
MVSortedTempResult.java
h2/src/main/org/h2/mvstore/db/MVSortedTempResult.java
+4
-18
ResultTempTable.java
h2/src/main/org/h2/result/ResultTempTable.java
+41
-50
没有找到文件。
h2/src/main/org/h2/mvstore/db/MVPlainTempResult.java
浏览文件 @
deb43030
...
...
@@ -5,8 +5,6 @@
*/
package
org
.
h2
.
mvstore
.
db
;
import
java.util.Arrays
;
import
org.h2.engine.Database
;
import
org.h2.expression.Expression
;
import
org.h2.message.DbException
;
...
...
@@ -22,11 +20,6 @@ import org.h2.value.ValueArray;
*/
class
MVPlainTempResult
extends
MVTempResult
{
/**
* The type of the distinct values.
*/
private
final
ValueDataType
distinctType
;
/**
* Map with identities of rows as keys rows as values.
*/
...
...
@@ -39,12 +32,6 @@ class MVPlainTempResult extends MVTempResult {
*/
private
long
counter
;
/**
* Optional index. This index is created only if {@link #contains(Value[])}
* method is invoked. Only the root result should have an index if required.
*/
private
MVMap
<
ValueArray
,
Boolean
>
index
;
/**
* Cursor for the {@link #next()} method.
*/
...
...
@@ -58,7 +45,6 @@ class MVPlainTempResult extends MVTempResult {
*/
private
MVPlainTempResult
(
MVPlainTempResult
parent
)
{
super
(
parent
);
this
.
distinctType
=
null
;
this
.
map
=
parent
.
map
;
}
...
...
@@ -75,46 +61,20 @@ class MVPlainTempResult extends MVTempResult {
MVPlainTempResult
(
Database
database
,
Expression
[]
expressions
,
int
visibleColumnCount
)
{
super
(
database
,
expressions
.
length
,
visibleColumnCount
);
ValueDataType
valueType
=
new
ValueDataType
(
database
.
getCompareMode
(),
database
,
new
int
[
columnCount
]);
if
(
columnCount
==
visibleColumnCount
)
{
distinctType
=
valueType
;
}
else
{
distinctType
=
new
ValueDataType
(
database
.
getCompareMode
(),
database
,
new
int
[
visibleColumnCount
]);
}
Builder
<
Long
,
ValueArray
>
builder
=
new
MVMap
.
Builder
<
Long
,
ValueArray
>().
valueType
(
valueType
);
map
=
store
.
openMap
(
"tmp"
,
builder
);
}
@Override
public
int
addRow
(
Value
[]
values
)
{
assert
parent
==
null
&&
index
==
null
;
assert
parent
==
null
;
map
.
put
(
counter
++,
ValueArray
.
get
(
values
));
return
++
rowCount
;
}
@Override
public
boolean
contains
(
Value
[]
values
)
{
// Only parent result maintains the index
if
(
parent
!=
null
)
{
return
parent
.
contains
(
values
);
}
if
(
index
==
null
)
{
createIndex
();
}
return
index
.
containsKey
(
ValueArray
.
get
(
values
));
}
private
void
createIndex
()
{
Builder
<
ValueArray
,
Boolean
>
builder
=
new
MVMap
.
Builder
<
ValueArray
,
Boolean
>().
keyType
(
distinctType
);
index
=
store
.
openMap
(
"idx"
,
builder
);
Cursor
<
Long
,
ValueArray
>
c
=
map
.
cursor
(
null
);
while
(
c
.
hasNext
())
{
c
.
next
();
ValueArray
row
=
c
.
getValue
();
if
(
columnCount
!=
visibleColumnCount
)
{
row
=
ValueArray
.
get
(
Arrays
.
copyOf
(
row
.
getList
(),
visibleColumnCount
));
}
index
.
putIfAbsent
(
row
,
true
);
}
throw
DbException
.
getUnsupportedException
(
"contains()"
);
}
@Override
...
...
This diff is collapsed.
Click to expand it.
h2/src/main/org/h2/mvstore/db/MVSortedTempResult.java
浏览文件 @
deb43030
...
...
@@ -171,7 +171,9 @@ class MVSortedTempResult extends MVTempResult {
}
else
{
distinctType
=
new
ValueDataType
(
database
.
getCompareMode
(),
database
,
new
int
[
visibleColumnCount
]);
if
(
distinct
)
{
createIndex
(
false
);
Builder
<
ValueArray
,
Boolean
>
indexBuilder
=
new
MVMap
.
Builder
<
ValueArray
,
Boolean
>()
.
keyType
(
distinctType
);
index
=
store
.
openMap
(
"idx"
,
indexBuilder
);
}
}
}
...
...
@@ -209,29 +211,13 @@ class MVSortedTempResult extends MVTempResult {
if
(
parent
!=
null
)
{
return
parent
.
contains
(
values
);
}
assert
distinct
;
if
(
columnCount
!=
visibleColumnCount
)
{
if
(
index
==
null
)
{
createIndex
(
true
);
}
return
index
.
containsKey
(
ValueArray
.
get
(
values
));
}
return
map
.
containsKey
(
getKey
(
values
));
}
private
void
createIndex
(
boolean
fill
)
{
Builder
<
ValueArray
,
Boolean
>
indexBuilder
=
new
MVMap
.
Builder
<
ValueArray
,
Boolean
>()
.
keyType
(
distinctType
);
index
=
store
.
openMap
(
"idx"
,
indexBuilder
);
if
(
fill
)
{
Cursor
<
ValueArray
,
Long
>
c
=
map
.
cursor
(
null
);
while
(
c
.
hasNext
())
{
Value
[]
v
=
getValue
(
c
.
next
().
getList
());
ValueArray
distinctRow
=
ValueArray
.
get
(
Arrays
.
copyOf
(
v
,
visibleColumnCount
));
index
.
putIfAbsent
(
distinctRow
,
true
);
}
}
}
@Override
public
synchronized
ResultExternal
createShallowCopy
()
{
if
(
parent
!=
null
)
{
...
...
This diff is collapsed.
Click to expand it.
h2/src/main/org/h2/result/ResultTempTable.java
浏览文件 @
deb43030
...
...
@@ -144,36 +144,7 @@ public class ResultTempTable implements ResultExternal {
closeable
=
new
CloseImpl
(
session
,
table
);
fileRef
=
tempFileDeleter
.
addFile
(
closeable
,
this
);
}
/*
* If ORDER BY or DISTINCT is specified create the index immediately. If
* they are not specified index still may be created later if required
* for IN (SELECT ...) etc.
*/
if
(
sort
!=
null
||
distinct
)
{
getIndex
();
}
}
private
ResultTempTable
(
ResultTempTable
parent
)
{
this
.
parent
=
parent
;
this
.
columnCount
=
parent
.
columnCount
;
this
.
distinct
=
parent
.
distinct
;
this
.
session
=
parent
.
session
;
this
.
table
=
parent
.
table
;
this
.
rowCount
=
parent
.
rowCount
;
this
.
sort
=
parent
.
sort
;
this
.
tempFileDeleter
=
null
;
this
.
closeable
=
null
;
this
.
fileRef
=
null
;
}
private
Index
getIndex
()
{
if
(
parent
!=
null
)
{
return
parent
.
getIndex
();
}
if
(
index
!=
null
)
{
return
index
;
}
IndexColumn
[]
indexCols
;
if
(
sort
!=
null
)
{
int
[]
colIndex
=
sort
.
getQueryColumnIndexes
();
...
...
@@ -215,6 +186,26 @@ public class ResultTempTable implements ResultExternal {
if
(
closeable
!=
null
)
{
closeable
.
index
=
index
;
}
}
}
private
ResultTempTable
(
ResultTempTable
parent
)
{
this
.
parent
=
parent
;
this
.
columnCount
=
parent
.
columnCount
;
this
.
distinct
=
parent
.
distinct
;
this
.
session
=
parent
.
session
;
this
.
table
=
parent
.
table
;
this
.
rowCount
=
parent
.
rowCount
;
this
.
sort
=
parent
.
sort
;
this
.
tempFileDeleter
=
null
;
this
.
closeable
=
null
;
this
.
fileRef
=
null
;
}
private
Index
getIndex
()
{
if
(
parent
!=
null
)
{
return
parent
.
getIndex
();
}
return
index
;
}
...
...
This diff is collapsed.
Click to expand it.
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论