00001 <?php
00023 class SMWCompatibilityHelpers {
00024
00035 static public function dataItemFromDBKeys( $typeid, $dbkeys ) {
00036 switch ( SMWDataValueFactory::getDataItemId( $typeid ) ) {
00037 case SMWDataItem::TYPE_ERROR: case SMWDataItem::TYPE_NOTYPE:
00038 break;
00039 case SMWDataItem::TYPE_NUMBER:
00040 return SMWDINumber::doUnserialize( $dbkeys[0] );
00041 case SMWDataItem::TYPE_STRING:
00042 return new SMWDIString( $dbkeys[0] );
00043 case SMWDataItem::TYPE_BLOB:
00044 return new SMWDIBlob( $dbkeys[0] );
00045 case SMWDataItem::TYPE_BOOLEAN:
00046 return new SMWDIBoolean( ( $dbkeys[0] == '1' ) );
00047 case SMWDataItem::TYPE_URI:
00048 if ( $typeid == '__typ' && $dbkeys[0]{0} == '_' ) {
00049 return SMWTypesValue::getTypeUriFromTypeId( $dbkeys[0] );
00050 } else {
00051 return SMWDIUri::doUnserialize( $dbkeys[0] );
00052 }
00053 case SMWDataItem::TYPE_TIME:
00054 $timedate = explode( 'T', $dbkeys[0], 2 );
00055 if ( ( count( $dbkeys ) == 2 ) && ( count( $timedate ) == 2 ) ) {
00056 $date = reset( $timedate );
00057 $year = $month = $day = $hours = $minutes = $seconds = $timeoffset = false;
00058 if ( ( end( $timedate ) === '' ) ||
00059 ( SMWTimeValue::parseTimeString( end( $timedate ), $hours, $minutes, $seconds, $timeoffset ) == true ) ) {
00060 $d = explode( '/', $date, 3 );
00061 if ( count( $d ) == 3 ) {
00062 list( $year, $month, $day ) = $d;
00063 } elseif ( count( $d ) == 2 ) {
00064 list( $year, $month ) = $d;
00065 } elseif ( count( $d ) == 1 ) {
00066 list( $year ) = $d;
00067 }
00068 if ( $month === '' ) $month = false;
00069 if ( $day === '' ) $day = false;
00070 $calendarmodel = SMWDITime::CM_GREGORIAN;
00071 return new SMWDITime( $calendarmodel, $year, $month, $day, $hours, $minutes, $seconds );
00072 }
00073 }
00074 break;
00075 case SMWDataItem::TYPE_GEO:
00076 return new SMWDIGeoCoord( array( 'lat' => (float)$dbkeys[0], 'lon' => (float)$dbkeys[1] ) );
00077 case SMWDataItem::TYPE_CONTAINER:
00078
00079
00080
00081 $semanticData = SMWContainerSemanticData::makeAnonymousContainer();
00082 foreach ( reset( $dbkeys ) as $value ) {
00083 if ( is_array( $value ) && ( count( $value ) == 2 ) ) {
00084 $diP = new SMWDIProperty( reset( $value ), false );
00085 $diV = self::dataItemFromDBKeys( $diP->findPropertyTypeID(), end( $value ) );
00086 $semanticData->addPropertyObjectValue( $diP, $diV );
00087 }
00088 }
00089 return new SMWDIContainer( $semanticData );
00090 case SMWDataItem::TYPE_WIKIPAGE:
00091 if ( $typeid == '__spf' ) {
00092 $pagedbkey = str_replace( ' ', '_', $dbkeys[0] );
00093 return new SMWDIWikiPage( $pagedbkey, SF_NS_FORM, '' );
00094 } elseif ( count( $dbkeys ) >= 5 ) {
00095 return new SMWDIWikiPage( $dbkeys[0], floatval( $dbkeys[1] ), $dbkeys[2], $dbkeys[4] );
00096 } elseif ( count( $dbkeys ) >= 3 ) {
00097 return new SMWDIWikiPage( $dbkeys[0], floatval( $dbkeys[1] ), $dbkeys[2] );
00098 }
00099 break;
00100 case SMWDataItem::TYPE_CONCEPT:
00101 if ( count( $dbkeys ) >= 5 ) {
00102 return new SMWDIConcept( $dbkeys[0], smwfXMLContentEncode( $dbkeys[1] ),
00103 $dbkeys[2], $dbkeys[3], $dbkeys[4] );
00104 }
00105 break;
00106 case SMWDataItem::TYPE_PROPERTY:
00107 return new SMWDIProperty( $dbkeys[0], false );
00108 }
00109 throw new SMWDataItemException( 'Failed to create data item from DB keys.' );
00110 }
00111
00119 public static function getDBkeysFromDataItem( SMWDataItem $dataItem ) {
00120 switch ( $dataItem->getDIType() ) {
00121 case SMWDataItem::TYPE_STRING: case SMWDataItem::TYPE_BLOB:
00122 return array( $dataItem->getString() );
00123 case SMWDataItem::TYPE_URI:
00124 return array( $dataItem->getSerialization() );
00125 case SMWDataItem::TYPE_WIKIPAGE:
00126 return array( $dataItem->getDBkey(), $dataItem->getNamespace(), $dataItem->getInterwiki(), $dataItem->getSortKey() );
00127 case SMWDataItem::TYPE_NUMBER:
00128 return array( $dataItem->getSerialization(), floatval( $dataItem->getNumber() ) );
00129 case SMWDataItem::TYPE_TIME:
00130 $xsdvalue = $dataItem->getYear() . "/" .
00131 ( ( $dataItem->getPrecision() >= SMWDITime::PREC_YM ) ? $dataItem->getMonth() : '' ) . "/" .
00132 ( ( $dataItem->getPrecision() >= SMWDITime::PREC_YMD ) ? $dataItem->getDay() : '' ) . "T";
00133 if ( $dataItem->getPrecision() == SMWDITime::PREC_YMDT ) {
00134 $xsdvalue .= sprintf( "%02d", $dataItem->getHour() ) . ':' .
00135 sprintf( "%02d", $dataItem->getMinute()) . ':' .
00136 sprintf( "%02d", $dataItem->getSecond() );
00137 }
00138 return array( $xsdvalue, $dataItem->getSortKey() );
00139 case SMWDataItem::TYPE_BOOLEAN:
00140 return $dataItem->getBoolean() ? array( '1', 1 ) : array( '0', 0 );
00141 case SMWDataItem::TYPE_CONTAINER:
00142 return array( false );
00143 case SMWDataItem::TYPE_CONCEPT:
00144 return array( $dataItem->getConceptQuery(), $dataItem->getDocumentation(), $dataItem->getQueryFeatures(), $dataItem->getSize(), $dataItem->getDepth() );
00145 case SMWDataItem::TYPE_PROPERTY:
00146 return array( $dataItem->getKey() );
00147 case SMWDataItem::TYPE_GEO:
00148 $coordinateSet = $dataItem->getCoordinateSet();
00149 return array(
00150 $coordinateSet['lat'],
00151 $coordinateSet['lon']
00152 );
00153 default:
00154 return array( false );
00155 }
00156 }
00157
00170 public static function getSignatureFromDataItemId( $dataItemId, $typeid ) {
00171 switch ( $dataItemId ) {
00172 case SMWDataItem::TYPE_STRING:
00173 return ( ( $typeid == '_txt' ) || ( $typeid == '_cod' ) ) ? 'l' : 't';
00174 case SMWDataItem::TYPE_URI: case SMWDataItem::TYPE_PROPERTY:
00175 return 't';
00176 case SMWDataItem::TYPE_WIKIPAGE:
00177 return 'tnwt';
00178 case SMWDataItem::TYPE_NUMBER: case SMWDataItem::TYPE_TIME:
00179 return 'tf';
00180 case SMWDataItem::TYPE_BOOLEAN:
00181 return 'tn';
00182 case SMWDataItem::TYPE_CONTAINER:
00183 return 'c';
00184 case SMWDataItem::TYPE_CONCEPT:
00185 return 'llnnn';
00186 case SMWDataItem::TYPE_GEO:
00187 return 'ff';
00188 default:
00189 return '';
00190 }
00191 }
00192
00206 public static function getIndexFromDataItemId( $dataItemId, $typeid, $labelIndex = false ) {
00207 switch ( $dataItemId ) {
00208 case SMWDataItem::TYPE_STRING:
00209 return ( ( $typeid == '_txt' ) || ( $typeid == '_cod' ) ) ? -1 : 0;
00210 case SMWDataItem::TYPE_WIKIPAGE:
00211 return 3;
00212 case SMWDataItem::TYPE_NUMBER: case SMWDataItem::TYPE_TIME: case SMWDataItem::TYPE_BOOLEAN:
00213 return $labelIndex ? 0 : 1;
00214 case SMWDataItem::TYPE_URI: case SMWDataItem::TYPE_PROPERTY:
00215 case SMWDataItem::TYPE_CONCEPT: case SMWDataItem::TYPE_GEO:
00216 return 0;
00217 case SMWDataItem::TYPE_CONTAINER: default:
00218 return -1;
00219 }
00220 }
00221
00222 }