public static IList <GdbWorkspace> CreateSchema( [NotNull] IEnumerable <ObjectClassMsg> objectClassMessages, [CanBeNull] ICollection <ObjectClassMsg> relClassMessages = null, Func <DataVerificationResponse, DataVerificationRequest> moreDataRequest = null) { var result = new List <GdbWorkspace>(); foreach (IGrouping <int, ObjectClassMsg> classGroup in objectClassMessages.GroupBy( c => c.WorkspaceHandle)) { GdbTableContainer gdbTableContainer = CreateGdbTableContainer(classGroup, moreDataRequest, out GdbWorkspace gdbWorkspace); result.Add(gdbWorkspace); if (relClassMessages == null) { continue; } foreach (ObjectClassMsg relTableMsg in relClassMessages.Where( r => r.WorkspaceHandle == gdbWorkspace.WorkspaceHandle)) { GdbTable relClassTable = FromObjectClassMsg(relTableMsg, gdbWorkspace); gdbTableContainer.TryAddRelationshipClass(relClassTable); } } return(result); }
public static GdbTableContainer CreateGdbTableContainer( [NotNull] IEnumerable <ObjectClassMsg> objectClassMessages, [CanBeNull] Func <DataVerificationResponse, DataVerificationRequest> getRemoteDataFunc, out GdbWorkspace workspace) { GdbTableContainer container = null; int?workspaceHandle = null; workspace = null; foreach (ObjectClassMsg objectClassMsg in objectClassMessages) { if (workspaceHandle == null) { workspaceHandle = objectClassMsg.WorkspaceHandle; container = new GdbTableContainer(); workspace = new GdbWorkspace(container) { WorkspaceHandle = objectClassMsg.WorkspaceHandle }; } else { Assert.AreEqual(workspaceHandle, objectClassMsg.WorkspaceHandle, "Not all features are from the same workspace"); } if (objectClassMsg.WorkspaceHandle == -1) { workspace = null; } Func <ITable, BackingDataset> createBackingDataset = null; if (getRemoteDataFunc != null) { createBackingDataset = (t) => new RemoteDataset(t, getRemoteDataFunc, new ClassDef { ClassHandle = objectClassMsg.ClassHandle, WorkspaceHandle = objectClassMsg.WorkspaceHandle }); } GdbTable gdbTable = FromObjectClassMsg(objectClassMsg, workspace, createBackingDataset); container.TryAdd(gdbTable); } return(container); }
public void CanCreateGdbTable() { // An in-memory backing dataset is created automatically, if no factory method is provided GdbTable gdbTable = new GdbTable(41, "TESTABLE", "Test table"); IObjectClass objectClass = gdbTable; Assert.AreEqual(41, objectClass.ObjectClassID); Assert.AreEqual("TESTABLE", DatasetUtils.GetName(objectClass)); Assert.AreEqual("Test table", DatasetUtils.GetAliasName(objectClass)); Assert.False(objectClass.HasOID); Assert.Null(objectClass.OIDFieldName); Assert.AreEqual(0, GdbQueryUtils.Count(objectClass, "")); // Add OID field gdbTable.AddField(FieldUtils.CreateOIDField()); Assert.True(objectClass.HasOID); Assert.AreEqual("OBJECTID", objectClass.OIDFieldName); IQueryFilter queryFilter = GdbQueryUtils.CreateQueryFilter("OBJECTID"); queryFilter.WhereClause = "OBJECTID < 0"; Assert.AreEqual(0, GdbQueryUtils.Count(objectClass, queryFilter)); var backingDataset = gdbTable.BackingDataset as InMemoryDataset; Assert.NotNull(backingDataset); backingDataset.AllRows.Add(new GdbRow(1, gdbTable)); Assert.AreEqual(0, GdbQueryUtils.Count(objectClass, queryFilter)); queryFilter.WhereClause = "OBJECTID > 0"; Assert.AreEqual(1, GdbQueryUtils.Count(objectClass, queryFilter)); }
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); }