Skip to content

Commit 48a17f9

Browse files
authored
Merge pull request #123 from ekvedaras/freeze-fixes
fix: freezes
2 parents 81656b1 + 8f17d00 commit 48a17f9

File tree

6 files changed

+109
-54
lines changed

6 files changed

+109
-54
lines changed

CHANGELOG.md

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,12 @@
44

55
## [Unreleased]
66

7+
### Fixed
8+
- Handle case when IDE can't be in smart mode #122
9+
- Less parallel things to avoid forking too much #123
10+
711
## [4.0.4]
8-
### Fixed
12+
### Fixed
913
- Add a bunch of `ProgressManager.checkCanceled()` checks. Should hopefully fix UI freeze. #114
1014

1115
## [4.0.3]
@@ -192,4 +196,4 @@
192196
- Table alias support
193197
- Model table name resolving
194198
- Relation table name resolving
195-
- Initial scaffold created from [IntelliJ Platform Plugin Template](https://github.com/JetBrains/intellij-platform-plugin-template)
199+
- Initial scaffold created from [IntelliJ Platform Plugin Template](https://github.com/JetBrains/intellij-platform-plugin-template)

src/main/kotlin/dev/ekvedaras/laravelquery/models/DbReferenceExpression.kt

Lines changed: 27 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,8 @@ import com.intellij.database.model.DasIndex
66
import com.intellij.database.model.DasNamespace
77
import com.intellij.database.model.DasTable
88
import com.intellij.database.model.DasTableKey
9-
import com.intellij.openapi.Disposable
10-
import com.intellij.openapi.application.ApplicationManager
119
import com.intellij.openapi.application.ReadAction
10+
import com.intellij.openapi.diagnostic.Logger
1211
import com.intellij.openapi.progress.ProcessCanceledException
1312
import com.intellij.openapi.project.DumbService
1413
import com.intellij.openapi.project.Project
@@ -21,8 +20,6 @@ import com.intellij.psi.PsiTreeChangeEvent
2120
import dev.ekvedaras.laravelquery.utils.DbReferenceResolver
2221
import dev.ekvedaras.laravelquery.utils.PsiUtils.Companion.unquoteAndCleanup
2322
import dev.ekvedaras.laravelquery.utils.TableAndAliasCollector
24-
import kotlin.math.exp
25-
import org.apache.commons.lang.StringUtils.substringBefore
2623

2724
class DbReferenceExpression(val expression: PsiElement, val type: Type) {
2825
companion object {
@@ -33,6 +30,9 @@ class DbReferenceExpression(val expression: PsiElement, val type: Type) {
3330
Key,
3431
ForeignKey,
3532
}
33+
34+
private val LOG = Logger.getInstance(DbReferenceExpression::class.java)
35+
private const val TIMEOUT_SECONDS = 5L
3636
}
3737

3838
val project: Project = expression.project
@@ -70,14 +70,30 @@ class DbReferenceExpression(val expression: PsiElement, val type: Type) {
7070
expressionDisposable.dispose()
7171
}
7272
}, expressionDisposable)
73-
ReadAction.nonBlocking<Unit> {
74-
try {
75-
TableAndAliasCollector(this).collect()
76-
DbReferenceResolver(this).resolve()
77-
} catch (_: ProcessCanceledException) {
78-
73+
74+
try {
75+
ReadAction.nonBlocking<Unit> {
76+
try {
77+
TableAndAliasCollector(this).collect()
78+
DbReferenceResolver(this).resolve()
79+
} catch (_: ProcessCanceledException) {
80+
// Process canceled, skip resolution
81+
}
82+
}
83+
.inSmartMode(project)
84+
.expireWith(expressionDisposable)
85+
.executeSynchronously()
86+
} catch (e: IllegalStateException) {
87+
// Handle inSmartMode constraint failure (issue #120)
88+
if (e.message?.contains("inSmartMode") == true) {
89+
LOG.debug("Cannot satisfy inSmartMode constraint, skipping DB reference resolution")
90+
} else {
91+
LOG.warn("Unexpected error during DB reference resolution", e)
7992
}
80-
}.inSmartMode(project).expireWith(expressionDisposable).executeSynchronously()
93+
} catch (_: ProcessCanceledException) {
94+
// Process was canceled, skip resolution
95+
LOG.debug("Process canceled during DB reference resolution")
96+
}
8197
}
8298
}
8399
}

src/main/kotlin/dev/ekvedaras/laravelquery/utils/AliasCollector.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ package dev.ekvedaras.laravelquery.utils
33
import com.jetbrains.php.lang.psi.elements.MethodReference
44
import com.jetbrains.php.lang.psi.elements.impl.StringLiteralExpressionImpl
55
import dev.ekvedaras.laravelquery.models.DbReferenceExpression
6-
import dev.ekvedaras.laravelquery.utils.DatabaseUtils.Companion.dbDataSourcesInParallel
6+
import dev.ekvedaras.laravelquery.utils.DatabaseUtils.Companion.dbDataSources
77
import dev.ekvedaras.laravelquery.utils.DatabaseUtils.Companion.nameWithoutPrefix
88
import dev.ekvedaras.laravelquery.utils.DatabaseUtils.Companion.tables
99
import dev.ekvedaras.laravelquery.utils.LaravelUtils.Companion.canHaveAliasParam
@@ -19,7 +19,7 @@ class AliasCollector(private val reference: DbReferenceExpression) {
1919
val table = referencedTable.substringBefore(" as ").substringBefore(" AS ").trim()
2020

2121
if (referencedSchema1 == null) {
22-
reference.project.dbDataSourcesInParallel().forEach loop@{ dataSource ->
22+
reference.project.dbDataSources().forEach loop@{ dataSource ->
2323
val dasTable = dataSource.tables().firstOrNull { it.nameWithoutPrefix(reference.project) == table } ?: return@loop
2424
referencedSchema1 = dasTable.dasParent?.name
2525
}

src/main/kotlin/dev/ekvedaras/laravelquery/utils/DatabaseUtils.kt

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,21 @@ class DatabaseUtils private constructor() {
2626
LaravelQuerySettings.getInstance(this).interestedIn(it)
2727
}
2828

29+
fun Project.dbDataSources(): Stream<out DbDataSource> =
30+
DbUtil.getDataSources(this).toList().stream().filter {
31+
LaravelQuerySettings.getInstance(this).interestedIn(it)
32+
}
33+
2934
fun DbDataSource.schemasInParallel(): Stream<out DasNamespace> =
3035
DasUtil.getSchemas(this).toList().parallelStream().filter {
3136
LaravelQuerySettings.getInstance(this.project).interestedIn(it, this)
3237
}.filter { !SchemasToSkip.contains(it.name) }
3338

39+
fun DbDataSource.schemas(): Stream<out DasNamespace> =
40+
DasUtil.getSchemas(this).toList().stream().filter {
41+
LaravelQuerySettings.getInstance(this.project).interestedIn(it, this)
42+
}.filter { !SchemasToSkip.contains(it.name) }
43+
3444
fun DbDataSource.tables() =
3545
DasUtil.getTables(this).filter {
3646
LaravelQuerySettings.getInstance(this.project).interestedIn(it, this)
@@ -45,24 +55,49 @@ class DatabaseUtils private constructor() {
4555
!it.isSystem && !SchemasToSkip.contains(it.dasParent?.name)
4656
}.filter { it.isPrefixed(this.project) }
4757

58+
fun DbDataSource.tablesSequential(): Stream<out DasTable> =
59+
DasUtil.getTables(this).toList().stream().filter {
60+
LaravelQuerySettings.getInstance(this.project).interestedIn(it, this)
61+
}.filter {
62+
!it.isSystem && !SchemasToSkip.contains(it.dasParent?.name)
63+
}.filter { it.isPrefixed(this.project) }
64+
4865
fun DasNamespace.tablesInParallel(project: Project): Stream<out DasTable> =
4966
this.getDasChildren(ObjectKind.TABLE).toList().parallelStream()
5067
.map { it as DasTable }
5168
.filter { !it.isSystem }
5269
.filter { it.isPrefixed(project) }
5370

71+
fun DasNamespace.tables(project: Project): Stream<out DasTable> =
72+
this.getDasChildren(ObjectKind.TABLE).toList().stream()
73+
.map { it as DasTable }
74+
.filter { !it.isSystem }
75+
.filter { it.isPrefixed(project) }
76+
5477
fun DasTable.columnsInParallel(): Stream<out DasColumn> =
5578
this.getDasChildren(ObjectKind.COLUMN).toList().parallelStream().map { it as DasColumn }
5679

80+
fun DasTable.columns(): Stream<out DasColumn> =
81+
this.getDasChildren(ObjectKind.COLUMN).toList().stream().map { it as DasColumn }
82+
5783
fun DasTable.indexesInParallel(): Stream<out DasIndex> =
5884
this.getDasChildren(ObjectKind.INDEX).toList().parallelStream().map { it as DasIndex }
5985

86+
fun DasTable.indexes(): Stream<out DasIndex> =
87+
this.getDasChildren(ObjectKind.INDEX).toList().stream().map { it as DasIndex }
88+
6089
fun DasTable.keysInParallel(): Stream<out DasTableKey> =
6190
this.getDasChildren(ObjectKind.KEY).toList().parallelStream().map { it as DasTableKey }
6291

92+
fun DasTable.keys(): Stream<out DasTableKey> =
93+
this.getDasChildren(ObjectKind.KEY).toList().stream().map { it as DasTableKey }
94+
6395
fun DasTable.foreignKeysInParallel(): Stream<out DasForeignKey> =
6496
this.getDasChildren(ObjectKind.FOREIGN_KEY).toList().parallelStream().map { it as DasForeignKey }
6597

98+
fun DasTable.foreignKeys(): Stream<out DasForeignKey> =
99+
this.getDasChildren(ObjectKind.FOREIGN_KEY).toList().stream().map { it as DasForeignKey }
100+
66101
private fun DasTable.isPrefixed(project: Project): Boolean =
67102
this.name.startsWith(LaravelQuerySettings.getInstance(project).tablePrefix)
68103

0 commit comments

Comments
 (0)