src/Apache.IoTDB/Template/Template.cs (118 lines of code) (raw):

/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ using System; using System.Collections.Generic; using Apache.IoTDB.DataStructure; using Thrift; namespace Apache.IoTDB { public class Template { private string name; private Dictionary<string, TemplateNode> children; private bool shareTime; public Template(string name, bool shareTime) { this.name = name; this.children = new Dictionary<string, TemplateNode>(); this.shareTime = shareTime; } public Template(string name) { this.name = name; this.children = new Dictionary<string, TemplateNode>(); this.shareTime = false; } public string Name { get { return name; } } public bool ShareTime { get { return shareTime; } set { shareTime = value; } } public void addToTemplate(TemplateNode child) { if (this.children.ContainsKey(child.Name)) { throw new Exception("Duplicated child of node in template."); } this.children.Add(child.Name, child); } public void deleteFromTemplate(string name) { if (this.children.ContainsKey(name)) { this.children.Remove(name); } else { throw new Exception("It is not a direct child of the template: " + name); } } public byte[] ToBytes() { var buffer = new ByteBuffer(); var stack = new Stack<KeyValuePair<string, TemplateNode>>(); var alignedPrefix = new HashSet<string>(); buffer.AddStr(this.name); buffer.AddBool(this.shareTime); if (this.shareTime) { alignedPrefix.Add(""); } foreach (var child in this.children.Values) { stack.Push(new KeyValuePair<string, TemplateNode>("", child)); } while (stack.Count != 0) { var pair = stack.Pop(); var prefix = pair.Key; var curNode = pair.Value; var fullPath = prefix; if (!curNode.isMeasurement()) { if (!"".Equals(prefix)) { fullPath += TsFileConstant.PATH_SEPARATOR; } fullPath += curNode.Name; if (curNode.isShareTime()) { alignedPrefix.Add(fullPath); } foreach (var child in curNode.getChildren().Values) { stack.Push(new KeyValuePair<string, TemplateNode>(fullPath, child)); } } else { buffer.AddStr(prefix); if (alignedPrefix.Contains(prefix)) { buffer.AddBool(true); } else { buffer.AddBool(false); } foreach (var singleByte in curNode.ToBytes()) { buffer.AddByte(singleByte); } } } return buffer.GetBuffer(); } } }