Skip to content
Original file line number Diff line number Diff line change
Expand Up @@ -624,22 +624,24 @@ object GraphQLActionBuilder {
val fields: MutableList<Gene> = mutableListOf()
val selectionInArgs = state.argsTablesIndexedByName[element.typeName] ?: listOf()
for (element in selectionInArgs) {
if (element.kindOfFieldType.lowercase() == GqlConst.SCALAR) {
val copy = element.copy(
fieldType = element.typeName,
KindOfFieldName = element.fieldType,
typeName = element.fieldName
)

if (element.KindOfFieldName.lowercase() == GqlConst.LIST) {
val copy = copyTableElement(element, element)
val template = getInputGene(state, history, maxTreeDepth, copy)

fields.add(template)
} else
if (element.KindOfFieldName.lowercase() == GqlConst.LIST) {
val copy = copyTableElement(element, element)
val template = getInputGene(state, history, maxTreeDepth, copy)
}
else
if (element.kindOfFieldType.lowercase() == GqlConst.SCALAR) {
val copy = element.copy(
fieldType = element.typeName,
KindOfFieldName = element.fieldType,
typeName = element.fieldName
)

val template = getInputGene(state, history, maxTreeDepth, copy)
fields.add(template)
} else
}
else
if (element.kindOfFieldType.lowercase() == GqlConst.INPUT_OBJECT) {
val copy = copyTableElement(element, element)
val template = getInputGene(state, history, maxTreeDepth, copy)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -972,72 +972,165 @@ object StateBuilder {
Extract tempArgsTables
*/
private fun extractTempArgsTables(state: TempState, schemaObj: SchemaObj) {
//Todo we need better strategies for arguments extraction
for (elementInInputParamTable in state.argsTables)
if (elementInInputParamTable.kindOfFieldType == __TypeKind.INPUT_OBJECT.toString())
for (elementIntypes in schemaObj.data.__schema.types)
if ((elementInInputParamTable.fieldType == elementIntypes.name) && (elementIntypes.kind == __TypeKind.INPUT_OBJECT))
for (elementInInputFields in elementIntypes.inputFields) {
val kind0 = elementInInputFields.type.kind
val kind1 = elementInInputFields?.type?.ofType?.kind
if (kind0 == __TypeKind.NON_NULL) {//non optional scalar or enum
if (kind1 == __TypeKind.SCALAR || kind1 == __TypeKind.ENUM) { // non optional scalar or enum

if (kind1 == __TypeKind.ENUM) {
val enumElement: MutableList<String> =
collectEnumElementsInTable(
schemaObj,
elementInInputFields.type.ofType.name
)

state.tempArgsTables.add(
Table(
typeName = elementIntypes.name,
kindOfFieldType = kind1.toString(),
isKindOfFieldTypeOptional = false,
fieldType = elementInInputFields.type.ofType.name,
fieldName = elementInInputFields.name,

enumValues = enumElement
/* val kind0 = elementInInputFields.type.kind
val kind1 = elementInInputFields?.type?.ofType?.kind*/

val (kind0, kind1, kind2, kind3) = quadKindsInInputs(elementInInputFields)

if (kind0 == __TypeKind.NON_NULL) {////non-optional list or scalar or enum
if (kind1 == __TypeKind.LIST) {//nn-optional list in the top
if (kind2 == __TypeKind.NON_NULL) {
if (kind3 == __TypeKind.ENUM) {
val enumElement: MutableList<String> =
collectEnumElementsInTable(
schemaObj,
elementInInputFields.type.ofType.ofType.ofType.name
)
state.tempArgsTables.add(
Table(
KindOfFieldName = __TypeKind.LIST.toString(),
isKindOfFieldNameOptional = false,

typeName = elementIntypes.name,
kindOfFieldType = kind3.toString(),
isKindOfFieldTypeOptional = false,
fieldType = elementInInputFields.type.ofType.ofType.ofType.name,
fieldName = elementInInputFields.name,
enumValues = enumElement
)
)
)
} else
state.tempArgsTables.add(
Table(
typeName = elementIntypes.name,
kindOfFieldType = kind1.toString(),
isKindOfFieldTypeOptional = false,
fieldType = elementInInputFields.type.ofType.name,
fieldName = elementInInputFields.name
} else
if (kind3 == __TypeKind.SCALAR) {
state.tempArgsTables.add(
Table(
KindOfFieldName = __TypeKind.LIST.toString(),
isKindOfFieldNameOptional = false,

typeName = elementIntypes.name,
kindOfFieldType = kind3.toString(),
isKindOfFieldTypeOptional = false,
fieldType = elementInInputFields.type.ofType.ofType.ofType.name,
fieldName = elementInInputFields.name
)
)
} else
//TODO: This portion will generate GC errors, fix me.
if (kind3 == __TypeKind.INPUT_OBJECT) {
state.tempArgsTables.add(
Table(
KindOfFieldName = __TypeKind.LIST.toString(),
isKindOfFieldNameOptional = false,

typeName = elementIntypes.name,
kindOfFieldType = kind3.toString(),
isKindOfFieldTypeOptional = false,
fieldType = elementInInputFields.type.ofType.ofType.ofType.name,
fieldName = elementInInputFields.name
)
)
}
}
} else {
if (kind1 == __TypeKind.SCALAR || kind1 == __TypeKind.ENUM) { // non-optional scalar or enum
if (kind1 == __TypeKind.ENUM) {
val enumElement: MutableList<String> =
collectEnumElementsInTable(
schemaObj,
elementInInputFields.type.ofType.name
)
state.tempArgsTables.add(
Table(
typeName = elementIntypes.name,
kindOfFieldType = kind1.toString(),
isKindOfFieldTypeOptional = false,
fieldType = elementInInputFields.type.ofType.name,
fieldName = elementInInputFields.name,

enumValues = enumElement
)
)
)
} else
state.tempArgsTables.add(
Table(
typeName = elementIntypes.name,
kindOfFieldType = kind1.toString(),
isKindOfFieldTypeOptional = false,
fieldType = elementInInputFields.type.ofType.name,
fieldName = elementInInputFields.name
)
)
}

}
} else // optional scalar or enum
if (kind0 == __TypeKind.SCALAR || kind0 == __TypeKind.ENUM) {// optional scalar or enum
if (kind0 == __TypeKind.ENUM) {
val enumElement: MutableList<String> =
collectEnumElementsInTable(schemaObj, elementInInputFields.type.name)
} else
//TODO: This portion will generate GC errors, fix me.
if (kind0 == __TypeKind.LIST) {

if (kind1 == __TypeKind.NON_NULL) {
if (kind2 == __TypeKind.INPUT_OBJECT) {
state.tempArgsTables.add(
Table(
KindOfFieldName = __TypeKind.LIST.toString(),
isKindOfFieldNameOptional = true,

typeName = elementIntypes.name,
kindOfFieldType = kind2.toString(),
isKindOfFieldTypeOptional = false,
fieldType = elementInInputFields.type.ofType.ofType.name,
fieldName = elementInInputFields.name,
)
)
}
}
} else
//TODO: This portion will generate GC errors, fix me.
if (kind0 == __TypeKind.INPUT_OBJECT) {
state.tempArgsTables.add(
Table(
typeName = elementIntypes.name,
kindOfFieldType = kind0.toString(),
isKindOfFieldTypeOptional = true,
fieldType = elementInInputFields.type.name,
fieldName = elementInInputFields.name,

enumValues = enumElement
)
)
} else
state.tempArgsTables.add(
Table(
typeName = elementIntypes.name,
kindOfFieldType = kind0.toString(),
isKindOfFieldTypeOptional = true,
fieldType = elementInInputFields.type.name,
fieldName = elementInInputFields.name
)
)
}
if (kind0 == __TypeKind.SCALAR || kind0 == __TypeKind.ENUM) {// optional scalar or enum
if (kind0 == __TypeKind.ENUM) {
val enumElement: MutableList<String> =
collectEnumElementsInTable(
schemaObj,
elementInInputFields.type.name
)
state.tempArgsTables.add(
Table(
typeName = elementIntypes.name,
kindOfFieldType = kind0.toString(),
isKindOfFieldTypeOptional = true,
fieldType = elementInInputFields.type.name,
fieldName = elementInInputFields.name,

enumValues = enumElement
)
)
} else
state.tempArgsTables.add(
Table(
typeName = elementIntypes.name,
kindOfFieldType = kind0.toString(),
isKindOfFieldTypeOptional = true,
fieldType = elementInInputFields.type.name,
fieldName = elementInInputFields.name
)
)
}
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1679,6 +1679,47 @@ class GraphQLActionBuilderTest {
val pipelineSchedule = actionCluster["pipelineSchedule"] as GraphQLAction
assertEquals(2, pipelineSchedule.parameters.size)
assertTrue(pipelineSchedule.parameters[1] is GQReturnParam)
/**/

val organizationInvitationCreate = actionCluster["organizationInvitationCreate"] as GraphQLAction
assertEquals(2, organizationInvitationCreate.parameters.size)
assertTrue(organizationInvitationCreate.parameters[0] is GQInputParam)

assertTrue(organizationInvitationCreate.parameters[0].name == "input")
assertTrue((organizationInvitationCreate.parameters[0].gene.getWrappedGene(ObjectGene::class.java) != null))
val objOrganizationInvitationCreate = organizationInvitationCreate.parameters[0].gene.getWrappedGene(ObjectGene::class.java)
if ( objOrganizationInvitationCreate != null) {

assertTrue( objOrganizationInvitationCreate.fields.any { it.getWrappedGene(ArrayGene::class.java)?.name == "emails" }) }


}

@Test
fun buildkiteFragmentTest() {
//This fragment is used for the issues with inputs
val actionCluster = mutableMapOf<String, Action>()
val json = GraphQLActionBuilderTest::class.java.getResource("/graphql/artificial/buildkite(fragment).json").readText()

val config = EMConfig()
GraphQLActionBuilder.addActionsFromSchema(json, actionCluster, config.treeDepth)

assertEquals(1, actionCluster.size)
val organizationInvitationCreate = actionCluster["organizationInvitationCreate"] as GraphQLAction
assertEquals(2, organizationInvitationCreate.parameters.size)
assertTrue(organizationInvitationCreate.parameters[0] is GQInputParam)

assertTrue(organizationInvitationCreate.parameters[0].name == "input")
assertTrue((organizationInvitationCreate.parameters[0].gene.getWrappedGene(ObjectGene::class.java) != null))
val objOrganizationInvitationCreate =
organizationInvitationCreate.parameters[0].gene.getWrappedGene(ObjectGene::class.java)
if (objOrganizationInvitationCreate != null) {

assertTrue(objOrganizationInvitationCreate.fields.any { it.getWrappedGene(ArrayGene::class.java)?.name == "emails" })
assertTrue(objOrganizationInvitationCreate.fields.any { it.getWrappedGene(ObjectGene::class.java)?.name == "sso" })
assertTrue(objOrganizationInvitationCreate.fields.any { it.getWrappedGene(ArrayGene::class.java)?.name == "teams" })
}


}

Expand Down
Loading