blob: 1be7d397cf46bd5760ae496f6f8bda990da4a246 [file] [log] [blame]
/*
* Copyright 2017 HugeGraph Authors
*
* 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.
*/
package com.baidu.hugegraph.structure.schema;
import com.baidu.hugegraph.driver.SchemaManager;
import com.baidu.hugegraph.structure.SchemaElement;
import com.baidu.hugegraph.structure.constant.AggregateType;
import com.baidu.hugegraph.structure.constant.Cardinality;
import com.baidu.hugegraph.structure.constant.DataType;
import com.baidu.hugegraph.structure.constant.HugeType;
import com.baidu.hugegraph.structure.constant.WriteType;
import com.baidu.hugegraph.util.E;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
public class PropertyKey extends SchemaElement {
@JsonProperty("data_type")
private DataType dataType;
@JsonProperty("cardinality")
private Cardinality cardinality;
@JsonProperty("aggregate_type")
private AggregateType aggregateType;
@JsonProperty("write_type")
private WriteType writeType;
@JsonCreator
public PropertyKey(@JsonProperty("name") String name) {
super(name);
this.dataType = DataType.TEXT;
this.cardinality = Cardinality.SINGLE;
this.aggregateType = AggregateType.NONE;
this.writeType = WriteType.OLTP;
}
@Override
public String type() {
return HugeType.PROPERTY_KEY.string();
}
public DataType dataType() {
return this.dataType;
}
public Cardinality cardinality() {
return this.cardinality;
}
public AggregateType aggregateType() {
return this.aggregateType;
}
public WriteType writeType() {
return this.writeType;
}
@Override
public String toString() {
return String.format("{name=%s, cardinality=%s, dataType=%s, " +
"aggregateType=%s, properties=%s, " +
"writeType=%s}",
this.name, this.cardinality, this.dataType,
this.aggregateType, this.properties,
this.writeType);
}
public PropertyKeyV46 switchV46() {
return new PropertyKeyV46(this);
}
public PropertyKeyV58 switchV58() {
return new PropertyKeyV58(this);
}
public interface Builder extends SchemaBuilder<PropertyKey> {
Builder dataType(DataType dataType);
Builder asText();
Builder asInt();
Builder asDate();
Builder asUUID();
Builder asBoolean();
Builder asByte();
Builder asBlob();
Builder asDouble();
Builder asFloat();
Builder asLong();
Builder cardinality(Cardinality cardinality);
Builder valueSingle();
Builder valueList();
Builder valueSet();
Builder aggregateType(AggregateType aggregateType);
Builder writeType(WriteType writeType);
Builder calcSum();
Builder calcMax();
Builder calcMin();
Builder calcOld();
Builder userdata(String key, Object val);
Builder ifNotExist();
}
public static class BuilderImpl implements Builder {
private PropertyKey propertyKey;
private SchemaManager manager;
public BuilderImpl(String name, SchemaManager manager) {
this.propertyKey = new PropertyKey(name);
this.manager = manager;
}
@Override
public PropertyKey build() {
return this.propertyKey;
}
@Override
public PropertyKey create() {
return this.manager.addPropertyKey(this.propertyKey);
}
@Override
public PropertyKey append() {
return this.manager.appendPropertyKey(this.propertyKey);
}
@Override
public PropertyKey eliminate() {
return this.manager.eliminatePropertyKey(this.propertyKey);
}
@Override
public void remove() {
this.manager.removePropertyKey(this.propertyKey.name);
}
@Override
public Builder dataType(DataType dataType) {
this.propertyKey.dataType = dataType;
return this;
}
@Override
public Builder asText() {
this.propertyKey.dataType = DataType.TEXT;
return this;
}
@Override
public Builder asInt() {
this.propertyKey.dataType = DataType.INT;
return this;
}
@Override
public Builder asDate() {
this.propertyKey.dataType = DataType.DATE;
return this;
}
@Override
public Builder asUUID() {
this.propertyKey.dataType = DataType.UUID;
return this;
}
@Override
public Builder asBoolean() {
this.propertyKey.dataType = DataType.BOOLEAN;
return this;
}
@Override
public Builder asByte() {
this.propertyKey.dataType = DataType.BYTE;
return this;
}
@Override
public Builder asBlob() {
this.propertyKey.dataType = DataType.BLOB;
return this;
}
@Override
public Builder asDouble() {
this.propertyKey.dataType = DataType.DOUBLE;
return this;
}
@Override
public Builder asFloat() {
this.propertyKey.dataType = DataType.FLOAT;
return this;
}
@Override
public Builder asLong() {
this.propertyKey.dataType = DataType.LONG;
return this;
}
@Override
public Builder cardinality(Cardinality cardinality) {
this.propertyKey.cardinality = cardinality;
return this;
}
@Override
public Builder valueSingle() {
this.propertyKey.cardinality = Cardinality.SINGLE;
return this;
}
@Override
public Builder valueList() {
this.propertyKey.cardinality = Cardinality.LIST;
return this;
}
@Override
public Builder valueSet() {
this.propertyKey.cardinality = Cardinality.SET;
return this;
}
@Override
public Builder aggregateType(AggregateType aggregateType) {
this.propertyKey.aggregateType = aggregateType;
return this;
}
@Override
public Builder writeType(WriteType writeType) {
this.propertyKey.writeType = writeType;
return this;
}
@Override
public Builder calcSum() {
this.propertyKey.aggregateType = AggregateType.SUM;
return this;
}
@Override
public Builder calcMax() {
this.propertyKey.aggregateType = AggregateType.MAX;
return this;
}
@Override
public Builder calcMin() {
this.propertyKey.aggregateType = AggregateType.MIN;
return this;
}
@Override
public Builder calcOld() {
this.propertyKey.aggregateType = AggregateType.OLD;
return this;
}
@Override
public Builder userdata(String key, Object val) {
E.checkArgumentNotNull(key, "The user data key can't be null");
E.checkArgumentNotNull(val, "The user data value can't be null");
this.propertyKey.userdata.put(key, val);
return this;
}
@Override
public Builder ifNotExist() {
this.propertyKey.checkExist = false;
return this;
}
}
public static class PropertyKeyWithTask {
@JsonProperty("property_key")
private PropertyKey propertyKey;
@JsonProperty("task_id")
private long taskId;
@JsonCreator
public PropertyKeyWithTask(@JsonProperty("property_key")
PropertyKey propertyKey,
@JsonProperty("task_id")
long taskId) {
this.propertyKey = propertyKey;
this.taskId = taskId;
}
public PropertyKey propertyKey() {
return this.propertyKey;
}
public long taskId() {
return this.taskId;
}
}
public static class PropertyKeyV46 extends SchemaElement {
@JsonProperty("data_type")
private DataType dataType;
@JsonProperty("cardinality")
private Cardinality cardinality;
@JsonCreator
public PropertyKeyV46(@JsonProperty("name") String name) {
super(name);
this.dataType = DataType.TEXT;
this.cardinality = Cardinality.SINGLE;
}
private PropertyKeyV46(PropertyKey propertyKey) {
super(propertyKey.name);
this.dataType = propertyKey.dataType;
this.cardinality = propertyKey.cardinality;
this.id = propertyKey.id();
this.properties = propertyKey.properties();
this.userdata = propertyKey.userdata();
this.checkExist = propertyKey.checkExist();
}
public DataType dataType() {
return this.dataType;
}
public Cardinality cardinality() {
return this.cardinality;
}
@Override
public String toString() {
return String.format("{name=%s, cardinality=%s, dataType=%s, " +
"properties=%s}", this.name, this.cardinality,
this.dataType, this.properties);
}
@Override
public String type() {
return HugeType.PROPERTY_KEY.string();
}
}
public static class PropertyKeyV58 extends PropertyKeyV46 {
@JsonProperty("aggregate_type")
private AggregateType aggregateType;
@JsonCreator
public PropertyKeyV58(@JsonProperty("name") String name) {
super(name);
this.aggregateType = AggregateType.NONE;
}
private PropertyKeyV58(PropertyKey propertyKey) {
super(propertyKey);
this.aggregateType = propertyKey.aggregateType;
}
public AggregateType aggregateType() {
return this.aggregateType;
}
@Override
public String toString() {
return String.format("{name=%s, cardinality=%s, dataType=%s, " +
"aggregateType=%s, properties=%s}", this.name,
this.cardinality(), this.dataType(),
this.aggregateType, this.properties);
}
}
}