private WikiDataState CheckCoordinateValue(Item item, String propertyId, Point expected, Boolean createStatement, Boolean overrideWrongData, out Statement statement) { if ( item == null ) throw new ArgumentNullException("item"); WikiDataState result = WikiDataState.Unknown; // Statement claim = item.Claims.FirstOrDefault(x => x.IsAboutProperty(WikiBase.PropertyIdCountry)) as Statement; var property = new EntityId(propertyId); Statement claim = item.Claims.FirstOrDefault(x => property.Equals(x.mainSnak.PropertyId)) as Statement; var dataValue = new GlobeCoordinateValue(Convert.ToDouble(expected.lat), Convert.ToDouble(expected.@long), 0.0001, Globe.Earth); var snak = new Snak(SnakType.Value, new EntityId(propertyId), dataValue); if ( claim == null ) { result = WikiDataState.NotSet; if ( createStatement ) { claim = item.createStatementForSnak(snak); } } else { Snak oldSnak = claim.mainSnak; var oldDataValue = oldSnak.DataValue as GlobeCoordinateValue; if ( (Math.Abs(oldDataValue.Latitude - dataValue.Latitude) < dataValue.Precision) && (Math.Abs(oldDataValue.Longitude - dataValue.Longitude) < dataValue.Precision) ) { result = WikiDataState.Valid; } else { result = WikiDataState.WrongValue; if ( overrideWrongData ) { claim.mainSnak = snak; } } } statement = claim as Statement; return result; }
/// <summary> /// Gets the location as a geopoint. /// </summary> /// <param name="item">Item to check.</param> /// <param name="propertyId">Id of the property.</param> /// <returns>Location as geopoint, or <c>null</c> if none is set.</returns> public GeoCoordinate GetCoordinateValue(Item item, String propertyId) { if ( item == null ) throw new ArgumentNullException("item"); // Statement claim = item.Claims.FirstOrDefault(x => x.IsAboutProperty(WikiBase.PropertyIdCountry)) as Statement; var property = new EntityId(propertyId); Statement claim = item.Claims.FirstOrDefault(x => property.Equals(x.mainSnak.PropertyId)) as Statement; if ( claim != null ) { Snak oldSnak = claim.mainSnak; if ( oldSnak != null ) { var oldDataValue = oldSnak.DataValue as GlobeCoordinateValue; if ( oldDataValue != null ) { return new GeoCoordinate(oldDataValue.Latitude, oldDataValue.Longitude); } } } return null; }
private WikiDataState PopulationData(Item item, PopulationData data, Boolean createStatement, Boolean overrideWrongData, out Statement statement) { var total = data.data.FirstOrDefault(y => y.type == PopulationDataType.total); var propertyName = WikiBase.PropertyIdPopulation; WikiDataState result = WikiDataState.Unknown; // Statement claim = item.Claims.FirstOrDefault(x => x.IsAboutProperty(WikiBase.PropertyIdCountry)) as Statement; var property = new EntityId(propertyName); var propertyPointInTime = new EntityId(WikiBase.PropertyIdPointInTime); var claimsForProperty = item.Claims.Where(x => property.Equals(x.mainSnak.PropertyId)); Statement claim = claimsForProperty.FirstOrDefault( x => x.Qualifiers.Any( y => y.PropertyId.Equals(propertyPointInTime) && y.DataValue is TimeValue && (y.DataValue as TimeValue).DateTime.Year == data.Year)) as Statement; var dataValue = new QuantityValue(total.total); var snak = new Snak(SnakType.Value, new EntityId(propertyName), dataValue); if ( claim == null ) { result = WikiDataState.NotSet; if ( createStatement ) { claim = item.createStatementForSnak(snak); } } else { Snak oldSnak = claim.mainSnak; var oldDataValue = snak.DataValue as QuantityValue; if ( oldDataValue.Equals(dataValue) ) { result = WikiDataState.Valid; } else { result = WikiDataState.WrongValue; if ( overrideWrongData ) { claim.mainSnak = snak; } } } statement = claim as Statement; return result; }
/// <summary> /// Checks and evetually sets a link property. /// </summary> /// <param name="item">Wikidata item.</param> /// <param name="propertyId">Id of the property.</param> /// <param name="expectedItemId">Expected item id.</param> /// <param name="createStatement"><c>true</c> to create the statement if not existing yet.</param> /// <param name="overrideWrongData"><c>true</c> to overwrite wrong data.</param> /// <param name="statement">Newly created statement.</param> /// <returns>Status of the link property.</returns> public WikiDataState CheckPropertyValue(Item item, String propertyId, String expectedItemId, Boolean createStatement, Boolean overrideWrongData, out Statement statement) { if ( item == null ) throw new ArgumentNullException("item"); WikiDataState result = WikiDataState.Unknown; // Statement claim = item.Claims.FirstOrDefault(x => x.IsAboutProperty(WikiBase.PropertyIdCountry)) as Statement; var property = new EntityId(propertyId); Statement claim = item.Claims.FirstOrDefault(x => property.Equals(x.mainSnak.PropertyId)) as Statement; var entity = new EntityId(expectedItemId); var dataValue = new EntityIdValue(entity); var snak = new Snak(SnakType.Value, new EntityId(propertyId), dataValue); if ( claim == null ) { if ( String.IsNullOrEmpty(expectedItemId) ) { result = WikiDataState.Valid; } else { result = WikiDataState.NotSet; if ( createStatement ) { claim = item.createStatementForSnak(snak); } } } else { Snak oldSnak = claim.mainSnak; var oldDataValue = oldSnak.DataValue as EntityIdValue; if ( oldDataValue.NumericId == dataValue.NumericId ) { result = WikiDataState.Valid; } else { if ( !String.IsNullOrEmpty(expectedItemId) ) { result = WikiDataState.WrongValue; if ( overrideWrongData ) { claim.mainSnak = snak; } } else { result = WikiDataState.DataMissing; } } } statement = claim as Statement; return result; }
private WikiDataState CheckStringMultiValue(Item item, String propertyId, String expectedValue, Boolean createStatement, out Statement statement) { if ( item == null ) throw new ArgumentNullException("item"); WikiDataState result = WikiDataState.Unknown; if ( String.IsNullOrEmpty(expectedValue) ) { statement = null; return result; // TODO better handling! } var dataValue = new StringValue(expectedValue); var snak = new Snak(SnakType.Value, new EntityId(propertyId), dataValue); var property = new EntityId(propertyId); Statement foundStatement = null; foreach ( var claim in item.Claims.Where(x => property.Equals(x.mainSnak.PropertyId)) ) { Snak oldSnak = claim.mainSnak; var oldDataValue = oldSnak.DataValue as StringValue; if ( oldDataValue.Value == dataValue.Value ) { foundStatement = claim as Statement; result = WikiDataState.Valid; } } if ( foundStatement == null ) { if ( String.IsNullOrEmpty(expectedValue) ) { result = WikiDataState.Valid; } else { result = WikiDataState.Incomplete; if ( createStatement ) { foundStatement = item.createStatementForSnak(snak); } } } statement = foundStatement; return result; }