package org.krakenapps.sqlengine.bdb; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.krakenapps.sqlparser.ast.ColumnConstraint; import org.krakenapps.sqlparser.ast.ColumnConstraintDefinition; import org.krakenapps.sqlparser.ast.NotNullConstraint; import org.krakenapps.sqlparser.ast.PrimaryKeyConstraint; import org.krakenapps.sqlparser.ast.ReferencesSpecification; import org.krakenapps.sqlparser.ast.UniqueConstraint; public class ConstraintSerializer { private ConstraintSerializer() { } public static Object serialize(List<ColumnConstraintDefinition> constraints) { List<Object> l = new ArrayList<Object>(); for (ColumnConstraintDefinition def : constraints) { Map<String, Object> m = new HashMap<String, Object>(); m.put("type", serializeConstraint(def.getColumnConstraint())); l.add(m); } return l; } @SuppressWarnings("unchecked") public static List<ColumnConstraintDefinition> deserialize(Object[] arr) { List<ColumnConstraintDefinition> l = new ArrayList<ColumnConstraintDefinition>(); for (Object o : arr) { Map<String, Object> m = (Map<String, Object>) o; ColumnConstraint constraint = deserializeConstraint((Object[]) m.get("type")); l.add(new ColumnConstraintDefinition(constraint)); } return l; } private static Object[] serializeConstraint(ColumnConstraint constraint) { if (constraint instanceof NotNullConstraint) return new Object[] { 1 }; if (constraint instanceof PrimaryKeyConstraint) return new Object[] { 2 }; if (constraint instanceof UniqueConstraint) return new Object[] { 3 }; if (constraint instanceof ReferencesSpecification) { ReferencesSpecification r = (ReferencesSpecification) constraint; return new Object[] { 4, r.getTableName(), r.getColumns() }; } throw new UnsupportedOperationException("not supported constraint: " + constraint); } private static ColumnConstraint deserializeConstraint(Object[] arr) { int type = (Integer) arr[0]; switch (type) { case 1: return new NotNullConstraint(); case 2: return new PrimaryKeyConstraint(); case 3: return new UniqueConstraint(); case 4: return new ReferencesSpecification((String) arr[1], toList((Object[]) arr[2])); default: throw new UnsupportedOperationException("not supported constraint: " + type); } } private static List<String> toList(Object[] arr) { List<String> l = new ArrayList<String>(); for (Object o : arr) l.add((String) o); return l; } }