diff options
author | Martin <marcin.j.chrzanowski@gmail.com> | 2019-11-23 20:41:04 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-11-23 20:41:04 +0100 |
commit | 9ea3ac76a93e4256dd8926574b2225726c6744cf (patch) | |
tree | 84ef29e83bbf55eca07683b040b7d2c4cf8ddc12 /src/main/java/pl/edu/mimuw/cloudatlas/interpreter/ResultList.java | |
parent | 2cb44b7d1861be2535ef6b2655af211b6a095402 (diff) |
ResultList i brakujące porównania (#28)
Diffstat (limited to 'src/main/java/pl/edu/mimuw/cloudatlas/interpreter/ResultList.java')
-rw-r--r-- | src/main/java/pl/edu/mimuw/cloudatlas/interpreter/ResultList.java | 139 |
1 files changed, 139 insertions, 0 deletions
diff --git a/src/main/java/pl/edu/mimuw/cloudatlas/interpreter/ResultList.java b/src/main/java/pl/edu/mimuw/cloudatlas/interpreter/ResultList.java new file mode 100644 index 0000000..c79a984 --- /dev/null +++ b/src/main/java/pl/edu/mimuw/cloudatlas/interpreter/ResultList.java @@ -0,0 +1,139 @@ +package pl.edu.mimuw.cloudatlas.interpreter; + +import java.util.ArrayList; +import java.util.List; + +import pl.edu.mimuw.cloudatlas.model.Type; +import pl.edu.mimuw.cloudatlas.model.TypePrimitive; +import pl.edu.mimuw.cloudatlas.model.TypeCollection; +import pl.edu.mimuw.cloudatlas.model.Value; +import pl.edu.mimuw.cloudatlas.model.ValueBoolean; +import pl.edu.mimuw.cloudatlas.model.ValueList; + +class ResultList extends Result { + private final List<Value> list; + + public ResultList(List<Value> list) { + this.list = list; + } + + @Override + protected ResultList binaryOperationTyped(BinaryOperation operation, ResultSingle right) { + List<Value> results = new ArrayList<Value>(); + + for (Value value : list) { + results.add(operation.perform(value, right.getValue())); + } + + return new ResultList(results); + } + + protected Result binaryOperationTyped(BinaryOperation operation, ResultList right) { + throw new UnsupportedOperationException("Binary operation not supported on two ResultLists"); + } + + protected Result binaryOperationTyped(BinaryOperation operation, ResultColumn right) { + throw new UnsupportedOperationException("Binary operation not supported on ResultList and ResultColumn"); + } + + @Override + public ResultList unaryOperation(UnaryOperation operation) { + List<Value> results = new ArrayList<Value>(); + + for (Value value : list) { + results.add(operation.perform(value)); + } + return new ResultList(results); + } + + @Override + protected Result callMe(BinaryOperation operation, Result left) { + return left.binaryOperationTyped(operation, this); + } + + @Override + public Value getValue() { + throw new UnsupportedOperationException("ResultList: Not a ResultSingle."); + } + + @Override + public ValueList getList() { + return new ValueList(list, TypeCollection.computeElementType(list)); + } + + @Override + public ValueList getColumn() { + throw new UnsupportedOperationException("Not a ResultColumn."); + } + + @Override + public ResultSingle aggregationOperation(AggregationOperation operation) { + return new ResultSingle(operation.perform(getList())); + } + + @Override + public Result transformOperation(TransformOperation operation) { + return new ResultList(operation.perform(getList())); + } + + @Override + public Result filterNulls() { + throw new UnsupportedOperationException("Operation filterNulls not supported yet."); + } + + @Override + public Result first(int size) { + List<Value> subList = list.subList(0, Math.min(size, list.size())); + return new ResultSingle(new ValueList(subList, TypeCollection.computeElementType(subList))); + } + + @Override + public Result last(int size) { + List<Value> subList = list.subList( + Math.max(0, list.size() - size), + list.size() + ); + return new ResultSingle(new ValueList(subList, TypeCollection.computeElementType(subList))); + } + + @Override + public Result random(int size) { + return new ResultSingle( + randomList( + new ValueList( + list, + TypeCollection.computeElementType(list) + ), + size + ) + ); + } + + @Override + public ResultList convertTo(Type to) { + List<Value> results = new ArrayList<Value>(); + + for (Value value : list) { + results.add(value.convertTo(to)); + } + + return new ResultList(results); + } + + @Override + public ResultSingle isNull() { + return new ResultSingle(new ValueBoolean(true)); + } + + @Override + public Type getType() { + Type type = TypePrimitive.NULL; + for (Value value : list) { + if (value.getType() != TypePrimitive.NULL) { + type = value.getType(); + } + } + + return type; + } +} |