Skip to content

Commit 04a93d4

Browse files
dhasani23David Hasani
authored andcommitted
feat(amazonq): support SQL conversions (aws#4995)
1 parent 0aa6b1b commit 04a93d4

37 files changed

+1045
-191
lines changed
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"type" : "feature",
3+
"description" : "Feature(Amazon Q Code Transformation): support conversions of embedded SQL from Oracle to PostgreSQL"
4+
}

plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/CodeModernizerManager.kt

Lines changed: 48 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ import software.aws.toolkits.jetbrains.services.codemodernizer.model.CodeModerni
4141
import software.aws.toolkits.jetbrains.services.codemodernizer.model.CodeModernizerSessionContext
4242
import software.aws.toolkits.jetbrains.services.codemodernizer.model.CodeModernizerStartJobResult
4343
import software.aws.toolkits.jetbrains.services.codemodernizer.model.CodeTransformHilDownloadArtifact
44+
import software.aws.toolkits.jetbrains.services.codemodernizer.model.CodeTransformType
4445
import software.aws.toolkits.jetbrains.services.codemodernizer.model.CustomerSelection
4546
import software.aws.toolkits.jetbrains.services.codemodernizer.model.Dependency
4647
import software.aws.toolkits.jetbrains.services.codemodernizer.model.InvalidTelemetryReason
@@ -59,6 +60,7 @@ import software.aws.toolkits.jetbrains.services.codemodernizer.toolwindow.CodeMo
5960
import software.aws.toolkits.jetbrains.services.codemodernizer.utils.STATES_WHERE_PLAN_EXIST
6061
import software.aws.toolkits.jetbrains.services.codemodernizer.utils.createFileCopy
6162
import software.aws.toolkits.jetbrains.services.codemodernizer.utils.findLineNumberByString
63+
import software.aws.toolkits.jetbrains.services.codemodernizer.utils.getJavaModulesWithSQL
6264
import software.aws.toolkits.jetbrains.services.codemodernizer.utils.getMavenVersion
6365
import software.aws.toolkits.jetbrains.services.codemodernizer.utils.getModuleOrProjectNameForFile
6466
import software.aws.toolkits.jetbrains.services.codemodernizer.utils.getPathToHilArtifactPomFile
@@ -125,53 +127,64 @@ class CodeModernizerManager(private val project: Project) : PersistentStateCompo
125127
JavaSdkVersion.JDK_11 to setOf(JavaSdkVersion.JDK_17),
126128
JavaSdkVersion.JDK_17 to setOf(JavaSdkVersion.JDK_17),
127129
)
130+
128131
init {
129132
CodeModernizerSessionState.getInstance(project).setDefaults()
130133
}
131134

132-
fun validate(project: Project): ValidationResult {
135+
fun validate(project: Project, transformationType: CodeTransformType): ValidationResult {
133136
fun validateCore(project: Project): ValidationResult {
134137
if (isRunningOnRemoteBackend()) {
135138
return ValidationResult(
136139
false,
137-
message("codemodernizer.notification.warn.invalid_project.description.reason.remote_backend"),
138140
InvalidTelemetryReason(
139-
CodeTransformPreValidationError.RemoteRunProject
141+
CodeTransformPreValidationError.RemoteRunProject,
140142
)
141143
)
142144
}
143145
if (!isCodeTransformAvailable(project)) {
144146
return ValidationResult(
145147
false,
146-
message("codemodernizer.notification.warn.invalid_project.description.reason.not_logged_in"),
147148
InvalidTelemetryReason(
148-
CodeTransformPreValidationError.NonSsoLogin
149+
CodeTransformPreValidationError.NonSsoLogin,
149150
)
150151
)
151152
}
152153

153154
if (ProjectRootManager.getInstance(project).contentRoots.isEmpty()) {
154155
return ValidationResult(
155156
false,
156-
message("codemodernizer.notification.warn.invalid_project.description.reason.missing_content_roots"),
157157
InvalidTelemetryReason(
158-
CodeTransformPreValidationError.NoPom
158+
CodeTransformPreValidationError.EmptyProject,
159159
)
160160
)
161161
}
162+
163+
if (transformationType == CodeTransformType.SQL_CONVERSION) {
164+
val javaModules = project.getJavaModulesWithSQL()
165+
return if (javaModules.isNotEmpty()) {
166+
ValidationResult(
167+
true,
168+
)
169+
} else {
170+
ValidationResult(
171+
false,
172+
InvalidTelemetryReason(
173+
CodeTransformPreValidationError.NoJavaProject,
174+
)
175+
)
176+
}
177+
}
178+
162179
val supportedModules = project.getSupportedModules(supportedJavaMappings).toSet()
163180
val validProjectJdk = project.getSupportedJavaMappings(supportedJavaMappings).isNotEmpty()
164181
val projectJdk = project.tryGetJdk()
165182
if (supportedModules.isEmpty() && !validProjectJdk) {
166183
return ValidationResult(
167184
false,
168-
message(
169-
"codemodernizer.notification.warn.invalid_project.description.reason.invalid_jdk_versions",
170-
supportedJavaMappings.keys.joinToString()
171-
),
172185
InvalidTelemetryReason(
173186
CodeTransformPreValidationError.UnsupportedJavaVersion,
174-
projectJdk?.toString().orEmpty()
187+
projectJdk.toString()
175188
)
176189
)
177190
}
@@ -180,17 +193,12 @@ class CodeModernizerManager(private val project: Project) : PersistentStateCompo
180193
ValidationResult(
181194
true,
182195
validatedBuildFiles = validatedBuildFiles,
183-
validatedProjectJdkName = projectJdk?.description.orEmpty(),
184196
buildSystem = CodeTransformBuildSystem.Maven,
185197
buildSystemVersion = getMavenVersion(project)
186198
)
187199
} else {
188200
ValidationResult(
189201
false,
190-
invalidReason = message(
191-
"codemodernizer.notification.warn.invalid_project.description.reason.no_valid_files",
192-
supportedBuildFileNames.joinToString()
193-
),
194202
invalidTelemetryReason = InvalidTelemetryReason(
195203
CodeTransformPreValidationError.UnsupportedBuildSystem,
196204
if (isGradleProject(project)) "Gradle build" else "other build"
@@ -248,15 +256,17 @@ class CodeModernizerManager(private val project: Project) : PersistentStateCompo
248256
}
249257
}
250258

251-
fun runModernize(copyResult: MavenCopyCommandsResult) {
259+
fun runModernize(copyResult: MavenCopyCommandsResult? = null) {
252260
initStopParameters()
253261
val session = codeTransformationSession as CodeModernizerSession
254262
initModernizationJobUI(true, project.getModuleOrProjectNameForFile(session.sessionContext.configurationFile))
255263
launchModernizationJob(session, copyResult)
256264
}
257265

258266
suspend fun resumePollingFromHil() {
259-
val result = handleJobResumedFromHil(managerState.getLatestJobId(), codeTransformationSession as CodeModernizerSession)
267+
val transformationType =
268+
if (codeTransformationSession?.sessionContext?.sqlMetadataZip != null) CodeTransformType.SQL_CONVERSION else CodeTransformType.LANGUAGE_UPGRADE
269+
val result = handleJobResumedFromHil(managerState.getLatestJobId(), codeTransformationSession as CodeModernizerSession, transformationType)
260270
postModernizationJob(result)
261271
}
262272

@@ -312,7 +322,7 @@ class CodeModernizerManager(private val project: Project) : PersistentStateCompo
312322
)
313323
}
314324

315-
fun launchModernizationJob(session: CodeModernizerSession, copyResult: MavenCopyCommandsResult) = projectCoroutineScope(project).launch {
325+
fun launchModernizationJob(session: CodeModernizerSession, copyResult: MavenCopyCommandsResult?) = projectCoroutineScope(project).launch {
316326
val result = initModernizationJob(session, copyResult)
317327

318328
postModernizationJob(result)
@@ -339,7 +349,8 @@ class CodeModernizerManager(private val project: Project) : PersistentStateCompo
339349
CodeModernizerSessionState.getInstance(project).currentJobCreationTime = currentJobResult.creationTime()
340350
codeTransformationSession = session
341351
initModernizationJobUI(false, project.getModuleOrProjectNameForFile(session.sessionContext.configurationFile))
342-
codeModernizerBottomWindowPanelManager.setResumeJobUI(currentJobResult, plan, session.sessionContext.sourceJavaVersion)
352+
val transformationType = if (session.sessionContext.sqlMetadataZip != null) CodeTransformType.SQL_CONVERSION else CodeTransformType.LANGUAGE_UPGRADE
353+
codeModernizerBottomWindowPanelManager.setResumeJobUI(currentJobResult, plan, session.sessionContext.sourceJavaVersion, transformationType)
343354
session.resumeJob(currentJobResult.creationTime(), lastJobId)
344355
val result = handleJobStarted(lastJobId, session)
345356
postModernizationJob(result)
@@ -395,7 +406,7 @@ class CodeModernizerManager(private val project: Project) : PersistentStateCompo
395406

396407
fun parseBuildFile(): String? = parseBuildFile(codeTransformationSession?.sessionContext?.configurationFile)
397408

398-
internal suspend fun initModernizationJob(session: CodeModernizerSession, copyResult: MavenCopyCommandsResult): CodeModernizerJobCompletedResult =
409+
private suspend fun initModernizationJob(session: CodeModernizerSession, copyResult: MavenCopyCommandsResult?): CodeModernizerJobCompletedResult =
399410
when (val result = session.createModernizationJob(copyResult)) {
400411
is CodeModernizerStartJobResult.ZipCreationFailed -> {
401412
CodeModernizerJobCompletedResult.UnableToCreateJob(
@@ -441,10 +452,12 @@ class CodeModernizerManager(private val project: Project) : PersistentStateCompo
441452
private suspend fun handleJobResumedFromHil(
442453
jobId: JobId,
443454
session: CodeModernizerSession,
455+
transformType: CodeTransformType,
444456
): CodeModernizerJobCompletedResult = session.pollUntilJobCompletion(
457+
transformType,
445458
jobId
446459
) { new, plan ->
447-
codeModernizerBottomWindowPanelManager.handleJobTransition(new, plan, session.sessionContext.sourceJavaVersion)
460+
codeModernizerBottomWindowPanelManager.handleJobTransition(new, plan, session.sessionContext.sourceJavaVersion, transformType)
448461
}
449462

450463
private suspend fun handleJobStarted(jobId: JobId, session: CodeModernizerSession): CodeModernizerJobCompletedResult {
@@ -455,8 +468,10 @@ class CodeModernizerManager(private val project: Project) : PersistentStateCompo
455468
codeModernizerBottomWindowPanelManager.setJobRunningUI()
456469
}
457470

458-
return session.pollUntilJobCompletion(jobId) { new, plan ->
459-
codeModernizerBottomWindowPanelManager.handleJobTransition(new, plan, session.sessionContext.sourceJavaVersion)
471+
val transformType = if (session.sessionContext.sqlMetadataZip != null) CodeTransformType.SQL_CONVERSION else CodeTransformType.LANGUAGE_UPGRADE
472+
473+
return session.pollUntilJobCompletion(transformType, jobId) { new, plan ->
474+
codeModernizerBottomWindowPanelManager.handleJobTransition(new, plan, session.sessionContext.sourceJavaVersion, transformType)
460475
}
461476
}
462477

@@ -661,10 +676,14 @@ class CodeModernizerManager(private val project: Project) : PersistentStateCompo
661676
fun createCodeModernizerSession(customerSelection: CustomerSelection, project: Project) {
662677
codeTransformationSession = CodeModernizerSession(
663678
CodeModernizerSessionContext(
664-
project,
665-
customerSelection.configurationFile,
666-
customerSelection.sourceJavaVersion,
667-
customerSelection.targetJavaVersion,
679+
project = project,
680+
configurationFile = customerSelection.configurationFile,
681+
sourceJavaVersion = customerSelection.sourceJavaVersion,
682+
targetJavaVersion = customerSelection.targetJavaVersion,
683+
sourceVendor = customerSelection.sourceVendor,
684+
targetVendor = customerSelection.targetVendor,
685+
sourceServerName = customerSelection.sourceServerName,
686+
sqlMetadataZip = customerSelection.sqlMetadataZip,
668687
),
669688
)
670689
}

plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/CodeModernizerSession.kt

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ import software.aws.toolkits.jetbrains.services.codemodernizer.model.CodeModerni
3232
import software.aws.toolkits.jetbrains.services.codemodernizer.model.CodeModernizerSessionContext
3333
import software.aws.toolkits.jetbrains.services.codemodernizer.model.CodeModernizerStartJobResult
3434
import software.aws.toolkits.jetbrains.services.codemodernizer.model.CodeTransformHilDownloadArtifact
35+
import software.aws.toolkits.jetbrains.services.codemodernizer.model.CodeTransformType
3536
import software.aws.toolkits.jetbrains.services.codemodernizer.model.DownloadArtifactResult
3637
import software.aws.toolkits.jetbrains.services.codemodernizer.model.JobId
3738
import software.aws.toolkits.jetbrains.services.codemodernizer.model.MavenCopyCommandsResult
@@ -61,13 +62,13 @@ import java.util.concurrent.CancellationException
6162
import java.util.concurrent.atomic.AtomicBoolean
6263
import javax.net.ssl.SSLHandshakeException
6364

64-
const val ZIP_SOURCES_PATH = "sources"
65-
const val BUILD_LOG_PATH = "build-logs.txt"
66-
const val UPLOAD_ZIP_MANIFEST_VERSION = 1.0F
6765
const val MAX_ZIP_SIZE = 2000000000 // 2GB
66+
<<<<<<< HEAD
6867
const val HIL_1P_UPGRADE_CAPABILITY = "HIL_1pDependency_VersionUpgrade"
6968
const val EXPLAINABILITY_V1 = "EXPLAINABILITY_V1"
7069
const val SELECTIVE_TRANSFORMATION_V1 = "SELECTIVE_TRANSFORMATION_V1"
70+
=======
71+
>>>>>>> 0e94d0252 (feat(amazonq): support SQL conversions (#4995))
7172

7273
// constants for handling SDKClientException
7374
const val CONNECTION_REFUSED_ERROR: String = "Connection refused"
@@ -145,7 +146,7 @@ class CodeModernizerSession(
145146
*
146147
* Based on [CodeWhispererCodeScanSession]
147148
*/
148-
fun createModernizationJob(copyResult: MavenCopyCommandsResult): CodeModernizerStartJobResult {
149+
fun createModernizationJob(copyResult: MavenCopyCommandsResult?): CodeModernizerStartJobResult {
149150
LOG.info { "Compressing local project" }
150151
val payload: File?
151152
var payloadSize = 0
@@ -165,6 +166,7 @@ class CodeModernizerSession(
165166
telemetryErrorMessage = "Disposed when about to create zip"
166167
return CodeModernizerStartJobResult.Disposed
167168
}
169+
// for language upgrades, copyResult should always be Successful here, failure cases already handled
168170
val result = sessionContext.createZipWithModuleFiles(copyResult)
169171

170172
if (result is ZipCreationResult.Missing1P) {
@@ -325,11 +327,6 @@ class CodeModernizerSession(
325327
return clientAdaptor.getCodeModernizationJob(jobId.id).transformationJob()
326328
}
327329

328-
fun getTransformPlanDetails(jobId: JobId): TransformationPlan {
329-
LOG.info { "Getting transform plan details." }
330-
return clientAdaptor.getCodeModernizationPlan(jobId).transformationPlan()
331-
}
332-
333330
/**
334331
* This will resume the job, i.e. it will resume the main job loop kicked of by [createModernizationJob]
335332
*/
@@ -419,6 +416,7 @@ class CodeModernizerSession(
419416
}
420417

421418
suspend fun pollUntilJobCompletion(
419+
transformType: CodeTransformType,
422420
jobId: JobId,
423421
jobTransitionHandler: (currentStatus: TransformationStatus, migrationPlan: TransformationPlan?) -> Unit,
424422
): CodeModernizerJobCompletedResult {
@@ -433,6 +431,7 @@ class CodeModernizerSession(
433431
var passedStart = false
434432

435433
val result = jobId.pollTransformationStatusAndPlan(
434+
transformType,
436435
succeedOn = setOf(
437436
TransformationStatus.COMPLETED,
438437
TransformationStatus.PAUSED,
@@ -464,8 +463,8 @@ class CodeModernizerSession(
464463
}
465464
}
466465

467-
// Open the transformation plan detail panel once transformation plan is available
468-
if (state.transformationPlan != null && !isTransformationPlanEditorOpened) {
466+
// Open the transformation plan detail panel once transformation plan is available (no plan for SQL conversions)
467+
if (transformType != CodeTransformType.SQL_CONVERSION && state.transformationPlan != null && !isTransformationPlanEditorOpened) {
469468
tryOpenTransformationPlanEditor()
470469
isTransformationPlanEditorOpened = true
471470
}

plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/CodeTransformChatApp.kt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,10 @@ private enum class CodeTransformMessageTypes(val type: String) {
3232
TabCreated("new-tab-was-created"),
3333
TabRemoved("tab-was-removed"),
3434
Transform("transform"),
35+
ChatPrompt("chat-prompt"), // for getting the transformation objective
3536
CodeTransformStart("codetransform-start"),
37+
CodeTransformSelectSQLMetadata("codetransform-select-sql-metadata"),
38+
CodeTransformSelectSQLModuleSchema("codetransform-select-sql-module-schema"),
3639
CodeTransformStop("codetransform-stop"),
3740
CodeTransformCancel("codetransform-cancel"),
3841
CodeTransformConfirmSkipTests("codetransform-confirm-skip-tests"),
@@ -64,8 +67,11 @@ class CodeTransformChatApp : AmazonQApp {
6467
CodeTransformMessageTypes.TabRemoved.type to IncomingCodeTransformMessage.TabRemoved::class,
6568
CodeTransformMessageTypes.Transform.type to IncomingCodeTransformMessage.Transform::class,
6669
CodeTransformMessageTypes.CodeTransformStart.type to IncomingCodeTransformMessage.CodeTransformStart::class,
70+
CodeTransformMessageTypes.CodeTransformSelectSQLMetadata.type to IncomingCodeTransformMessage.CodeTransformSelectSQLMetadata::class,
71+
CodeTransformMessageTypes.CodeTransformSelectSQLModuleSchema.type to IncomingCodeTransformMessage.CodeTransformSelectSQLModuleSchema::class,
6772
CodeTransformMessageTypes.CodeTransformStop.type to IncomingCodeTransformMessage.CodeTransformStop::class,
6873
CodeTransformMessageTypes.CodeTransformCancel.type to IncomingCodeTransformMessage.CodeTransformCancel::class,
74+
CodeTransformMessageTypes.ChatPrompt.type to IncomingCodeTransformMessage.ChatPrompt::class,
6975
CodeTransformMessageTypes.CodeTransformConfirmSkipTests.type to IncomingCodeTransformMessage.CodeTransformConfirmSkipTests::class,
7076
CodeTransformMessageTypes.CodeTransformConfirmOneOrMultipleDiffs.type to IncomingCodeTransformMessage.CodeTransformConfirmOneOrMultipleDiffs::class,
7177
CodeTransformMessageTypes.CodeTransformNew.type to IncomingCodeTransformMessage.CodeTransformNew::class,
@@ -155,8 +161,12 @@ class CodeTransformChatApp : AmazonQApp {
155161
when (message) {
156162
is IncomingCodeTransformMessage.Transform -> inboundAppMessagesHandler.processTransformQuickAction(message)
157163
is IncomingCodeTransformMessage.CodeTransformStart -> inboundAppMessagesHandler.processCodeTransformStartAction(message)
164+
is IncomingCodeTransformMessage.CodeTransformSelectSQLMetadata -> inboundAppMessagesHandler.processCodeTransformSelectSQLMetadataAction(message)
165+
is IncomingCodeTransformMessage.CodeTransformSelectSQLModuleSchema ->
166+
inboundAppMessagesHandler.processCodeTransformSelectSQLModuleSchemaAction(message)
158167
is IncomingCodeTransformMessage.CodeTransformCancel -> inboundAppMessagesHandler.processCodeTransformCancelAction(message)
159168
is IncomingCodeTransformMessage.CodeTransformStop -> inboundAppMessagesHandler.processCodeTransformStopAction(message.tabId)
169+
is IncomingCodeTransformMessage.ChatPrompt -> inboundAppMessagesHandler.processChatPromptMessage(message)
160170
is IncomingCodeTransformMessage.CodeTransformConfirmSkipTests -> inboundAppMessagesHandler.processCodeTransformConfirmSkipTests(message)
161171
is IncomingCodeTransformMessage.CodeTransformConfirmOneOrMultipleDiffs -> inboundAppMessagesHandler.processCodeTransformOneOrMultipleDiffs(message)
162172
is IncomingCodeTransformMessage.CodeTransformNew -> inboundAppMessagesHandler.processCodeTransformNewAction(message)

0 commit comments

Comments
 (0)