public static ObjectClassMsg ToObjectClassMsg([NotNull] Table objectClass, SpatialReference spatialRef = null) { esriGeometryType geometryType = TranslateAGPShapeType(objectClass); string name = objectClass.GetName(); string aliasName = objectClass.GetDefinition().GetAliasName(); if (spatialRef == null && objectClass is FeatureClass fc) { spatialRef = fc.GetDefinition().GetSpatialReference(); } ObjectClassMsg result = new ObjectClassMsg() { Name = name, Alias = aliasName, ClassHandle = (int)objectClass.GetID(), SpatialReference = ToSpatialReferenceMsg( spatialRef, SpatialReferenceMsg.FormatOneofCase.SpatialReferenceEsriXml), GeometryType = (int)geometryType, WorkspaceHandle = 0 //workspace?.GetHashCode() ?? -1 }; return(result); }
public static ObjectClassMsg ToObjectClassMsg([NotNull] ITable table, int classHandle, bool includeFields = false, string aliasName = null) { esriGeometryType geometryType = esriGeometryType.esriGeometryNull; ISpatialReference spatialRef = null; if (table is IFeatureClass fc) { geometryType = fc.ShapeType; spatialRef = DatasetUtils.GetSpatialReference(fc); } IWorkspace workspace = ((IDataset)table).Workspace; ObjectClassMsg result = new ObjectClassMsg() { Name = DatasetUtils.GetName(table), ClassHandle = classHandle, SpatialReference = ProtobufGeometryUtils.ToSpatialReferenceMsg( spatialRef, SpatialReferenceMsg.FormatOneofCase.SpatialReferenceEsriXml), GeometryType = (int)geometryType, WorkspaceHandle = workspace?.GetHashCode() ?? -1 }; if (aliasName == null) { aliasName = DatasetUtils.GetAliasName((IObjectClass)table); } CallbackUtils.DoWithNonNull(aliasName, s => result.Alias = s); if (includeFields) { List <FieldMsg> fieldMessages = new List <FieldMsg>(); for (int i = 0; i < table.Fields.FieldCount; i++) { IField field = table.Fields.Field[i]; fieldMessages.Add(ToFieldMsg(field)); } result.Fields.AddRange(fieldMessages); } return(result); }
private ITable GetRemoteQueryTable([NotNull] string relationshipClassName, [NotNull] Model model, [NotNull] IList <ITable> tables, JoinType joinType, [CanBeNull] string whereClause) { var dataRequest = new DataVerificationResponse { SchemaRequest = new SchemaRequest() }; RelationshipClassQuery relClassQueryMsg = new RelationshipClassQuery { RelationshipClassName = relationshipClassName, WorkspaceHandle = model.Id, JoinType = (int)joinType, }; relClassQueryMsg.Tables.AddRange(tables.Select(DatasetUtils.GetName)); if (!string.IsNullOrEmpty(whereClause)) { relClassQueryMsg.WhereClause = whereClause; } dataRequest.SchemaRequest.RelationshipClassQueries.Add(relClassQueryMsg); DataVerificationRequest dataResponse = _dataRequestFunc(dataRequest); GdbWorkspace gdbWorkspace = Assert.NotNull(_virtualWorkspaces).First(w => w.WorkspaceHandle == model.Id); ObjectClassMsg queryTableMsg = dataResponse.Schema.RelclassDefinitions.First(); Func <ITable, BackingDataset> createBackingDataset = null; if (_dataRequestFunc != null) { createBackingDataset = (t) => new RemoteDataset(t, _dataRequestFunc, null, relClassQueryMsg); } // It is cached on the client side, in case various tests utilize the same definition. // TODO: Test! return(ProtobufConversionUtils.FromObjectClassMsg(queryTableMsg, gdbWorkspace, createBackingDataset)); }
public static GdbTable FromObjectClassMsg( [NotNull] ObjectClassMsg objectClassMsg, [CanBeNull] IWorkspace workspace, [CanBeNull] Func <ITable, BackingDataset> createBackingDataset = null) { esriGeometryType geometryType = (esriGeometryType)objectClassMsg.GeometryType; GdbTable result; if (geometryType == esriGeometryType.esriGeometryNull) { result = new GdbTable(objectClassMsg.ClassHandle, objectClassMsg.Name, objectClassMsg.Alias, createBackingDataset, workspace); } else { result = new GdbFeatureClass( objectClassMsg.ClassHandle, objectClassMsg.Name, (esriGeometryType)objectClassMsg.GeometryType, objectClassMsg.Alias, createBackingDataset, workspace) { SpatialReference = ProtobufGeometryUtils.FromSpatialReferenceMsg( objectClassMsg.SpatialReference) }; } if (objectClassMsg.Fields == null || objectClassMsg.Fields.Count <= 0) { return(result); } foreach (FieldMsg fieldMsg in objectClassMsg.Fields) { IField field = FieldUtils.CreateField(fieldMsg.Name, (esriFieldType)fieldMsg.Type, fieldMsg.AliasName); if (field.Type == esriFieldType.esriFieldTypeString) { ((IFieldEdit)field).Length_2 = fieldMsg.Length; } else if (field.Type == esriFieldType.esriFieldTypeGeometry) { var sr = ProtobufGeometryUtils.FromSpatialReferenceMsg( objectClassMsg.SpatialReference); field = FieldUtils.CreateShapeField(geometryType, sr, 1000, true, false); } if (result.Fields.FindField(field.Name) < 0) { result.AddField(field); } else { _msg.DebugFormat("Field {0} is duplicate or has been added previously", field.Name); } } return(result); }