[go: nahoru, domu]

Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Working on arrays in input objects as required argument. #695

Open
wants to merge 10 commits into
base: master
Choose a base branch
from
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