@@ -16,11 +16,19 @@ import org.jetbrains.exposed.sql.SqlExpressionBuilder.like
16
16
import org.jetbrains.exposed.sql.insert
17
17
18
18
private object Symbols : Table() {
19
- val fqName = varchar(" fqname" , length = 255 ).primaryKey()
20
- val shortName = varchar(" shortname" , length = 80 )
19
+ val fqName = varchar(" fqname" , length = 255 ) references FqNames .fqName
21
20
val kind = integer(" kind" )
22
21
val visibility = integer(" visibility" )
23
22
val extensionReceiverType = varchar(" extensionreceivertype" , length = 255 ).nullable()
23
+
24
+ override val primaryKey = PrimaryKey (fqName)
25
+ }
26
+
27
+ private object FqNames : Table() {
28
+ val fqName = varchar(" fqname" , length = 255 )
29
+ val shortName = varchar(" shortname" , length = 80 )
30
+
31
+ override val primaryKey = PrimaryKey (fqName)
24
32
}
25
33
26
34
/* *
@@ -33,7 +41,7 @@ class SymbolIndex {
33
41
34
42
init {
35
43
transaction(db) {
36
- SchemaUtils .create(Symbols )
44
+ SchemaUtils .create(Symbols , FqNames )
37
45
}
38
46
}
39
47
@@ -50,23 +58,28 @@ class SymbolIndex {
50
58
transaction(db) {
51
59
Symbols .deleteAll()
52
60
53
- // TODO: Workaround, since insertIgnore seems to throw UnsupportedByDialectExceptions
54
- // when used with H2.
55
- val addedFqns = mutableSetOf<FqName >()
56
-
57
61
for (descriptor in descriptors) {
58
62
val fqn = descriptor.fqNameSafe
63
+ val extensionReceiverFqn = descriptor.accept(ExtractSymbolExtensionReceiverType , Unit )
59
64
60
- if (! addedFqns.contains(fqn)) {
61
- addedFqns.add(fqn)
62
- Symbols .insert {
63
- it[fqName] = fqn.toString()
64
- it[shortName] = fqn.shortName().toString()
65
- it[kind] = descriptor.accept(ExtractSymbolKind , Unit ).rawValue
66
- it[visibility] = descriptor.accept(ExtractSymbolVisibility , Unit ).rawValue
67
- it[extensionReceiverType] = descriptor.accept(ExtractSymbolExtensionReceiverType , Unit )?.toString()
65
+ FqNames .replace {
66
+ it[fqName] = fqn.toString()
67
+ it[shortName] = fqn.shortName().toString()
68
+ }
69
+
70
+ extensionReceiverFqn?.let { rFqn ->
71
+ FqNames .replace {
72
+ it[fqName] = rFqn.toString()
73
+ it[shortName] = rFqn.shortName().toString()
68
74
}
69
75
}
76
+
77
+ Symbols .replace {
78
+ it[fqName] = fqn.toString()
79
+ it[kind] = descriptor.accept(ExtractSymbolKind , Unit ).rawValue
80
+ it[visibility] = descriptor.accept(ExtractSymbolVisibility , Unit ).rawValue
81
+ it[extensionReceiverType] = extensionReceiverFqn?.toString()
82
+ }
70
83
}
71
84
72
85
val finished = System .currentTimeMillis()
@@ -82,9 +95,17 @@ class SymbolIndex {
82
95
}
83
96
}
84
97
85
- fun query (prefix : String , limit : Int = 20): List <Symbol > = transaction(db) {
86
- Symbols
87
- .select { Symbols .shortName.like(" $prefix %" ) }
98
+ fun query (prefix : String , receiverType : FqName ? = null, limit : Int = 20): List <Symbol > = transaction(db) {
99
+ (Symbols innerJoin FqNames )
100
+ .select {
101
+ FqNames .shortName
102
+ .like(" $prefix %" )
103
+ .let { q ->
104
+ receiverType?.let { t ->
105
+ q and (Symbols .extensionReceiverType eq wrapAsExpression(FqNames .slice(FqNames .fqName.count()).select { FqNames .shortName.like(" $t %" ) }))
106
+ } ? : q
107
+ }
108
+ }
88
109
.limit(limit)
89
110
.map { Symbol (
90
111
fqName = FqName (it[Symbols .fqName]),
0 commit comments