summaryrefslogtreecommitdiff
path: root/www/wiki/extensions/SemanticMediaWiki/src/MediaWiki/Api/PropertyListByApiRequest.php
diff options
context:
space:
mode:
Diffstat (limited to 'www/wiki/extensions/SemanticMediaWiki/src/MediaWiki/Api/PropertyListByApiRequest.php')
-rw-r--r--www/wiki/extensions/SemanticMediaWiki/src/MediaWiki/Api/PropertyListByApiRequest.php297
1 files changed, 297 insertions, 0 deletions
diff --git a/www/wiki/extensions/SemanticMediaWiki/src/MediaWiki/Api/PropertyListByApiRequest.php b/www/wiki/extensions/SemanticMediaWiki/src/MediaWiki/Api/PropertyListByApiRequest.php
new file mode 100644
index 00000000..d2eb662d
--- /dev/null
+++ b/www/wiki/extensions/SemanticMediaWiki/src/MediaWiki/Api/PropertyListByApiRequest.php
@@ -0,0 +1,297 @@
+<?php
+
+namespace SMW\MediaWiki\Api;
+
+use SMW\ApplicationFactory;
+use SMW\DIProperty;
+use SMW\PropertySpecificationLookup;
+use SMW\RequestOptions;
+use SMW\Store;
+use SMW\StringCondition;
+
+/**
+ * @license GNU GPL v2+
+ * @since 2.4
+ *
+ * @author mwjames
+ */
+class PropertyListByApiRequest {
+
+ /**
+ * @var Store
+ */
+ private $store;
+
+ /**
+ * @var PropertySpecificationLookup
+ */
+ private $propertySpecificationLookup;
+
+ /**
+ * @var RequestOptions
+ */
+ private $requestOptions = null;
+
+ /**
+ * @var array
+ */
+ private $propertyList = [];
+
+ /**
+ * @var array
+ */
+ private $namespaces = [];
+
+ /**
+ * @var array
+ */
+ private $meta = [];
+
+ /**
+ * @var integer
+ */
+ private $limit = 50;
+
+ /**
+ * @var array
+ */
+ private $continueOffset = 1;
+
+ /**
+ * @var string
+ */
+ private $languageCode = '';
+
+ /**
+ * @var boolean
+ */
+ private $listOnly = false;
+
+ /**
+ * @since 2.4
+ *
+ * @param Store $store
+ * @param PropertySpecificationLookup $propertySpecificationLookup
+ */
+ public function __construct( Store $store, PropertySpecificationLookup $propertySpecificationLookup ) {
+ $this->store = $store;
+ $this->propertySpecificationLookup = $propertySpecificationLookup;
+ }
+
+ /**
+ * @since 2.4
+ *
+ * @param integer $limit
+ */
+ public function setLimit( $limit ) {
+ $this->limit = (int)$limit;
+ }
+
+ /**
+ * @since 2.5
+ *
+ * @param boolean $listOnly
+ */
+ public function setListOnly( $listOnly ) {
+ $this->listOnly = (bool)$listOnly;
+ }
+
+ /**
+ * @since 2.4
+ *
+ * @param string $languageCode
+ */
+ public function setLanguageCode( $languageCode ) {
+ $this->languageCode = (string)$languageCode;
+ }
+
+ /**
+ * @since 2.4
+ *
+ * @param array
+ */
+ public function getPropertyList() {
+ return $this->propertyList;
+ }
+
+ /**
+ * @since 2.4
+ *
+ * @param array
+ */
+ public function getNamespaces() {
+ return $this->namespaces;
+ }
+
+ /**
+ * @since 2.4
+ *
+ * @param array
+ */
+ public function getMeta() {
+ return $this->meta;
+ }
+
+ /**
+ * @since 2.4
+ *
+ * @param array
+ */
+ public function getContinueOffset() {
+ return $this->continueOffset;
+ }
+
+ /**
+ * @since 2.4
+ *
+ * @param string $property
+ *
+ * @return boolean
+ */
+ public function findPropertyListBy( $property = '' ) {
+
+ $requestOptions = new RequestOptions();
+ $requestOptions->sort = true;
+ $requestOptions->limit = $this->limit;
+
+ $isFromCache = false;
+
+ //
+ $this->matchPropertiesToPreferredLabelBy( $property );
+
+ // Increase by one to look ahead
+ $requestOptions->limit++;
+
+ $requestOptions = $this->doModifyRequestOptionsWith(
+ $property,
+ $requestOptions
+ );
+
+ $propertyListLookup = $this->store->getPropertiesSpecial( $requestOptions );
+
+ // Restore original limit
+ $requestOptions->limit--;
+
+ foreach ( $propertyListLookup->fetchList() as $value ) {
+
+ if ( $this->continueOffset > $requestOptions->limit ) {
+ break;
+ }
+
+ $this->addPropertyToList( $value );
+ $this->continueOffset++;
+ }
+
+ $this->continueOffset = $this->continueOffset > $requestOptions->limit ? $requestOptions->limit : 0;
+ $this->namespaces = array_keys( $this->namespaces );
+
+ $this->meta = [
+ 'limit' => $requestOptions->limit,
+ 'count' => count( $this->propertyList ),
+ 'isCached' => $propertyListLookup->isFromCache()
+ ];
+
+ return true;
+ }
+
+ private function doModifyRequestOptionsWith( $property, $requestOptions ) {
+
+ if ( $property === '' ) {
+ return $requestOptions;
+ }
+
+ if ( $property{0} !== '_' ) {
+ $property = str_replace( "_", " ", $property );
+ }
+
+ // Try to match something like _MDAT to find a label and
+ // make the request a success
+ try {
+ $property = DIProperty::newFromUserLabel( $property )->getLabel();
+ } catch ( \Exception $e ) {
+ $property = '';
+ }
+
+ $requestOptions->addStringCondition(
+ $property,
+ StringCondition::STRCOND_MID
+ );
+
+ // Disjunctive condition to allow for auto searches to match foaf OR Foaf
+ $requestOptions->addStringCondition(
+ ucfirst( $property ),
+ StringCondition::STRCOND_MID,
+ true
+ );
+
+ // Allow something like FOO to match the search string `foo`
+ $requestOptions->addStringCondition(
+ strtoupper( $property ),
+ StringCondition::STRCOND_MID,
+ true
+ );
+
+ return $requestOptions;
+ }
+
+ private function addPropertyToList( array $value ) {
+
+ if ( $value === [] || !$value[0] instanceof DIProperty ) {
+ return;
+ }
+
+ $property = $value[0];
+ $key = $property->getKey();
+
+ if ( strpos( $key, ':' ) !== false ) {
+ $this->namespaces[substr( $key, 0, strpos( $key, ':' ) )] = true;
+ }
+
+ $this->propertyList[$key] = [
+ 'label' => $property->getLabel(),
+ 'key' => $property->getKey()
+ ];
+
+ if ( $this->listOnly ) {
+ return;
+ }
+
+ $this->propertyList[$key]['isUserDefined'] = $property->isUserDefined();
+ $this->propertyList[$key]['usageCount'] = $value[1];
+ $this->propertyList[$key]['description'] = $this->findPropertyDescriptionBy( $property );
+ }
+
+ private function findPropertyDescriptionBy( DIProperty $property ) {
+
+ $description = $this->propertySpecificationLookup->getPropertyDescriptionByLanguageCode(
+ $property,
+ $this->languageCode
+ );
+
+ if ( $description === '' || $description === null ) {
+ return $description;
+ }
+
+ return [
+ $this->languageCode => $description
+ ];
+ }
+
+ private function matchPropertiesToPreferredLabelBy( $label ) {
+
+ $propertyLabelFinder = ApplicationFactory::getInstance()->getPropertyLabelFinder();
+
+ // Use the proximity search on a text field
+ $label = '~*' . $label . '*';
+
+ $results = $propertyLabelFinder->findPropertyListFromLabelByLanguageCode(
+ $label,
+ $this->languageCode
+ );
+
+ foreach ( $results as $result ) {
+ $this->addPropertyToList( [ $result, 0 ] );
+ }
+ }
+
+}