Пример #1
0
        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);
        }
Пример #2
0
        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);
        }
Пример #3
0
        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));
        }
Пример #4
0
        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);
        }