Skip to content

Commit c3b7620

Browse files
committed
GQL: Support property data type
This adds support for fetching statements with property values including the labels of the property used as the value. Bug: T404838 Change-Id: I944264c039ac6e04930d98d18354bbdc730e0a92
1 parent 08f4f22 commit c3b7620

File tree

5 files changed

+105
-6
lines changed

5 files changed

+105
-6
lines changed

repo/WikibaseRepo.datatypes.php

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
use Wikibase\DataModel\Entity\EntityIdParsingException;
4545
use Wikibase\DataModel\Entity\EntityIdValue;
4646
use Wikibase\DataModel\Entity\ItemId;
47+
use Wikibase\DataModel\Entity\PropertyId;
4748
use Wikibase\Lib\Formatters\EntityIdValueFormatter;
4849
use Wikibase\Lib\Formatters\SnakFormat;
4950
use Wikibase\Lib\Formatters\SnakFormatter;
@@ -610,6 +611,43 @@
610611
'rdf-data-type' => function() {
611612
return PropertySpecificComponentsRdfBuilder::OBJECT_PROPERTY;
612613
},
614+
'graphql-value-type' => static function() {
615+
$labelsResolver = WbReuse::getPropertyLabelsResolver();
616+
$languageCodeType = WbReuse::getLanguageCodeType();
617+
618+
return new ObjectType( [
619+
'name' => 'PropertyValue',
620+
'fields' => [
621+
'id' => [
622+
'type' => Type::nonNull( Type::string() ),
623+
'resolve' => function( Statement|PropertyValuePair $valueProvider ) {
624+
/** @var EntityIdValue $idValue */
625+
$idValue = $valueProvider->value->content;
626+
'@phan-var EntityIdValue $idValue';
627+
628+
return $idValue->getEntityId()->getSerialization();
629+
},
630+
],
631+
'label' => [
632+
'type' => Type::string(),
633+
'args' => [
634+
'languageCode' => Type::nonNull( $languageCodeType ),
635+
],
636+
'resolve' => function( Statement|PropertyValuePair $valueProvider, array $args ) use( $labelsResolver ) {
637+
/** @var EntityIdValue $idValue */
638+
$idValue = $valueProvider->value->content;
639+
'@phan-var EntityIdValue $idValue';
640+
641+
/** @var PropertyId $propertyId */
642+
$propertyId = $idValue->getEntityId();
643+
'@phan-var PropertyId $propertyId';
644+
645+
return $labelsResolver->resolve( $propertyId, $args['languageCode'] );
646+
},
647+
],
648+
],
649+
] );
650+
},
613651
],
614652
];
615653
} );

repo/domains/reuse/src/Infrastructure/GraphQL/schema.graphql

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ type PredicateProperty {
5252
label(languageCode: LanguageCode!): String
5353
}
5454

55-
union Value = StringValue | ItemValue | GlobeCoordinateValue | MonolingualTextValue | QuantityValue | TimeValue
55+
union Value = StringValue | ItemValue | PropertyValue | GlobeCoordinateValue | MonolingualTextValue | QuantityValue | TimeValue
5656

5757
type StringValue {
5858
content: String!
@@ -63,6 +63,11 @@ type ItemValue {
6363
label(languageCode: LanguageCode!): String
6464
}
6565

66+
type PropertyValue {
67+
id: String!
68+
label(languageCode: LanguageCode!): String
69+
}
70+
6671
type GlobeCoordinateValue {
6772
latitude: Float!
6873
longitude: Float!

repo/domains/reuse/src/WbReuse.ServiceWiring.php

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,7 @@
2929
'WbReuse.GraphQLSchema' => function( MediaWikiServices $services ): Schema {
3030
$languageCodeType = WbReuse::getLanguageCodeType( $services );
3131
$predicatePropertyType = new PredicatePropertyType(
32-
new PropertyLabelsResolver(
33-
new BatchGetPropertyLabels( new PrefetchingTermLookupBatchLabelsRetriever(
34-
WikibaseRepo::getPrefetchingTermLookup( $services ),
35-
) ),
36-
),
32+
WbReuse::getPropertyLabelsResolver( $services ),
3733
$languageCodeType,
3834
);
3935
$valueType = new ValueType( WikibaseRepo::getDataTypeDefinitions( $services )->getGraphqlValueTypes() );
@@ -79,6 +75,13 @@
7975
'WbReuse.LanguageCodeType' => function( MediaWikiServices $services ): LanguageCodeType {
8076
return new LanguageCodeType( WikibaseRepo::getTermsLanguages( $services )->getLanguages() );
8177
},
78+
'WbReuse.PropertyLabelsResolver' => function( MediaWikiServices $services ): PropertyLabelsResolver {
79+
return new PropertyLabelsResolver(
80+
new BatchGetPropertyLabels(
81+
new PrefetchingTermLookupBatchLabelsRetriever( WikibaseRepo::getPrefetchingTermLookup( $services ) )
82+
)
83+
);
84+
},
8285
'WbReuse.StringValueType' => function( MediaWikiServices $services ): StringValueType {
8386
return new StringValueType();
8487
},

repo/domains/reuse/src/WbReuse.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
use Psr\Container\ContainerInterface;
77
use Wikibase\Repo\Domains\Reuse\Infrastructure\GraphQL\GraphQLService;
88
use Wikibase\Repo\Domains\Reuse\Infrastructure\GraphQL\Resolvers\ItemLabelsResolver;
9+
use Wikibase\Repo\Domains\Reuse\Infrastructure\GraphQL\Resolvers\PropertyLabelsResolver;
910
use Wikibase\Repo\Domains\Reuse\Infrastructure\GraphQL\Schema\LanguageCodeType;
1011
use Wikibase\Repo\Domains\Reuse\Infrastructure\GraphQL\Schema\Schema;
1112
use Wikibase\Repo\Domains\Reuse\Infrastructure\GraphQL\Schema\StringValueType;
@@ -29,6 +30,11 @@ public static function getItemLabelsResolver( ?ContainerInterface $services = nu
2930
->get( 'WbReuse.ItemLabelsResolver' );
3031
}
3132

33+
public static function getPropertyLabelsResolver( ?ContainerInterface $services = null ): PropertyLabelsResolver {
34+
return ( $services ?: MediaWikiServices::getInstance() )
35+
->get( 'WbReuse.PropertyLabelsResolver' );
36+
}
37+
3238
public static function getLanguageCodeType( ?ContainerInterface $services = null ): LanguageCodeType {
3339
return ( $services ?: MediaWikiServices::getInstance() )
3440
->get( 'WbReuse.LanguageCodeType' );

repo/domains/reuse/tests/phpunit/Infrastructure/GraphQL/GraphQLServiceTest.php

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
use MediaWikiIntegrationTestCase;
1919
use Wikibase\DataAccess\PrefetchingTermLookup;
2020
use Wikibase\DataAccess\Tests\InMemoryPrefetchingTermLookup;
21+
use Wikibase\DataModel\Entity\EntityIdValue;
2122
use Wikibase\DataModel\Entity\Item;
2223
use Wikibase\DataModel\Entity\ItemId;
2324
use Wikibase\DataModel\Entity\NumericPropertyId;
@@ -56,6 +57,8 @@ class GraphQLServiceTest extends MediaWikiIntegrationTestCase {
5657
private static Property $monolingualTextProperty;
5758
private static Property $quantityProperty;
5859
private static Property $timeProperty;
60+
private static Property $propertyTypeProperty;
61+
private static Property $propertyUsedAsValue;
5962
private static Property $qualifierProperty;
6063
private static MediaWikiSite $sitelinkSite;
6164
private const ALLOWED_SITELINK_SITES = [ 'examplewiki', 'otherwiki' ];
@@ -83,6 +86,7 @@ public function testQuery( string $query, array $expectedResult ): void {
8386
self::$qualifierProperty,
8487
self::$statementValueItem,
8588
self::$qualifierValueItem,
89+
self::$propertyUsedAsValue,
8690
] );
8791

8892
$dataTypeLookup = new InMemoryDataTypeLookup();
@@ -94,6 +98,7 @@ public function testQuery( string $query, array $expectedResult ): void {
9498
self::$monolingualTextProperty,
9599
self::$quantityProperty,
96100
self::$timeProperty,
101+
self::$propertyTypeProperty,
97102
] as $property ) {
98103
$dataTypeLookup->setDataTypeForProperty( $property->getId(), $property->getDataTypeId() );
99104
}
@@ -140,6 +145,7 @@ public function queryProvider(): Generator {
140145
$statementWithMonolingualTextValuePropertyId = 'P7';
141146
$statementWithQuantityValuePropertyId = 'P8';
142147
$statementWithTimeValuePropertyId = 'P9';
148+
$statementWithPropertyValuePropertyId = 'P10';
143149
$statementWithItemValueQualifierPropertyId = $statementWithItemValuePropertyId; // also type wikibase-item so we can just reuse it.
144150
$statementReferencePropertyId = 'P11';
145151
$unusedPropertyId = 'P9999';
@@ -198,6 +204,15 @@ public function queryProvider(): Generator {
198204
->withGuid( "$itemId\$a82559b1-da8f-4e02-9f72-e304b90a9bde" )
199205
->withValue( $timeValue )
200206
->build();
207+
self::$propertyUsedAsValue = new Property(
208+
new NumericPropertyId( 'P789' ),
209+
new Fingerprint( new TermList( [ new Term( 'en', 'property used as value' ) ] ) ),
210+
'string',
211+
);
212+
$statementWithPropertyValue = NewStatement::forProperty( $statementWithPropertyValuePropertyId )
213+
->withGuid( "$itemId\$a82559b1-da8f-4e02-9f72-e304b90a9bde" )
214+
->withValue( new EntityIdValue( self::$propertyUsedAsValue->getId() ) )
215+
->build();
201216

202217
$statementWithNoValue = NewStatement::noValueFor( ( $statementWithNoValuePropertyId ) )
203218
->withGuid( "$itemId\$bed933b7-4207-d679-7571-3630cfb49d9f" )
@@ -237,6 +252,11 @@ public function queryProvider(): Generator {
237252
null,
238253
'time',
239254
);
255+
self::$propertyTypeProperty = new Property(
256+
new NumericPropertyId( $statementWithPropertyValuePropertyId ),
257+
null,
258+
'wikibase-property',
259+
);
240260
self::$qualifierProperty = new Property(
241261
new NumericPropertyId( $qualifierPropertyId ),
242262
new Fingerprint( new TermList( [ new Term( 'en', 'qualifier prop' ) ] ) ),
@@ -255,6 +275,7 @@ public function queryProvider(): Generator {
255275
->andStatement( $statementWithQuantityValue )
256276
->andStatement( $statementWithUnboundedQuantityValue )
257277
->andStatement( $statementWithTimeValue )
278+
->andStatement( $statementWithPropertyValue )
258279
->andStatement( $statementWithNoValue )
259280
->andStatement( $statementWithSomeValue )
260281
->build();
@@ -549,6 +570,32 @@ public function queryProvider(): Generator {
549570
],
550571
],
551572
];
573+
yield 'statement with property value' => [
574+
"{ item(id: \"$itemId\") {
575+
statements(propertyId: \"$statementWithPropertyValuePropertyId\") {
576+
value {
577+
... on PropertyValue {
578+
id
579+
label(languageCode: \"en\")
580+
}
581+
}
582+
}
583+
} }",
584+
[
585+
'data' => [
586+
'item' => [
587+
'statements' => [
588+
[
589+
'value' => [
590+
'id' => self::$propertyUsedAsValue->getId()->getSerialization(),
591+
'label' => self::$propertyUsedAsValue->getLabels()->getByLanguage( 'en' )->getText(),
592+
],
593+
],
594+
],
595+
],
596+
],
597+
],
598+
];
552599
yield 'statements with novalue and somevalue' => [
553600
"{ item(id: \"$itemId\") {
554601
$statementWithSomeValuePropertyId: statements(propertyId: \"$statementWithSomeValuePropertyId\") {

0 commit comments

Comments
 (0)