blob: 3ea3252a852baad6eb960a669d85a04f03ae474a [file] [log] [blame]
/*
* 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 org.apache.sysds.parser;
import java.util.HashMap;
import org.apache.sysds.common.Types.DataType;
import org.apache.sysds.common.Types.FileFormat;
import org.apache.sysds.common.Types.ValueType;
import org.apache.sysds.parser.LanguageException.LanguageErrorCodes;
import org.apache.sysds.runtime.privacy.PrivacyConstraint;
import org.apache.sysds.runtime.privacy.PrivacyConstraint.PrivacyLevel;
public abstract class Identifier extends Expression
{
protected DataType _dataType;
protected ValueType _valueType;
protected long _dim1;
protected long _dim2;
protected int _blocksize;
protected long _nnz;
protected FileFormat _format;
protected PrivacyConstraint _privacy;
public Identifier() {
_dim1 = -1;
_dim2 = -1;
_dataType = DataType.UNKNOWN;
_valueType = ValueType.UNKNOWN;
_blocksize = -1;
_nnz = -1;
setOutput(this);
_format = null;
}
public void setProperties(Identifier i) {
if (i == null)
return;
_dataType = i.getDataType();
_valueType = i.getValueType();
if (i instanceof IndexedIdentifier) {
_dim1 = ((IndexedIdentifier)i).getOrigDim1();
_dim2 = ((IndexedIdentifier)i).getOrigDim2();
}
else {
_dim1 = i.getDim1();
_dim2 = i.getDim2();
}
_blocksize = i.getBlocksize();
_nnz = i.getNnz();
_format = i.getFileFormat();
_privacy = i.getPrivacy();
}
public void setDimensionValueProperties(Identifier i) {
if (i instanceof IndexedIdentifier) {
IndexedIdentifier ixi = (IndexedIdentifier)i;
_dim1 = ixi.getOrigDim1();
_dim2 = ixi.getOrigDim2();
}
else {
_dim1 = i.getDim1();
_dim2 = i.getDim2();
}
_nnz = i.getNnz();
_dataType = i.getDataType();
_valueType = i.getValueType();
}
public void setDataType(DataType dt){
_dataType = dt;
}
public void setValueType(ValueType vt){
_valueType = vt;
}
public void setFileFormat(FileFormat ft){
_format = ft;
}
public void setDimensions(long dim1, long dim2){
_dim1 = dim1;
_dim2 = dim2;
}
public void setNnz(long nnzs){
_nnz = nnzs;
}
public void setPrivacy(PrivacyLevel privacyLevel){
_privacy = new PrivacyConstraint(privacyLevel);
}
public void setPrivacy(PrivacyConstraint privacyConstraint){
_privacy = privacyConstraint;
}
public long getDim1(){
return _dim1;
}
public long getDim2(){
return _dim2;
}
public DataType getDataType(){
return _dataType;
}
public ValueType getValueType(){
return _valueType;
}
public FileFormat getFileFormat(){
return _format;
}
public int getBlocksize(){
return _blocksize;
}
public void setBlocksize(int blen){
_blocksize = blen;
}
public long getNnz(){
return _nnz;
}
public PrivacyConstraint getPrivacy(){
return _privacy;
}
@Override
public void validateExpression(HashMap<String,DataIdentifier> ids, HashMap<String,ConstIdentifier> constVars, boolean conditional)
{
if( getOutput() instanceof DataIdentifier ) {
// set properties for Data identifier
String name = ((DataIdentifier)getOutput()).getName();
Identifier id = ids.get(name);
if ( id == null ){
//undefined variables are always treated unconditionally as error in order to prevent common script-level bugs
raiseValidateError("Undefined Variable (" + name + ") used in statement", false, LanguageErrorCodes.INVALID_PARAMETERS);
}
getOutput().setProperties(id);
// validate IndexedIdentifier -- which is substype of DataIdentifer with index
if( getOutput() instanceof IndexedIdentifier ){
// validate the row / col index bounds (if defined)
IndexedIdentifier ixId = (IndexedIdentifier)getOutput();
Expression[] exp = new Expression[]{ixId.getRowLowerBound(),
ixId.getRowUpperBound(), ixId.getColLowerBound(), ixId.getColUpperBound()};
String[] msg = new String[]{"row lower", "row upper", "column lower", "column upper"};
for( int i=0; i<4; i++ ) {
if( exp[i] != null ) {
exp[i].validateExpression(ids, constVars, conditional);
if (exp[i].getOutput().getDataType() == DataType.MATRIX){
raiseValidateError("Matrix values for "+msg[i]+" index bound are "
+ "not supported, which includes indexed identifiers.", conditional);
}
}
}
if( getOutput().getDataType() == DataType.LIST ) {
int dim1 = (((IndexedIdentifier)getOutput()).getRowUpperBound() == null) ? 1 : - 1;
((IndexedIdentifier)getOutput()).setDimensions(dim1, 1);
}
else { //default
IndexPair updatedIndices = ((IndexedIdentifier)getOutput()).calculateIndexedDimensions(ids, constVars, conditional);
((IndexedIdentifier)getOutput()).setDimensions(updatedIndices._row, updatedIndices._col);
}
}
}
else {
this.getOutput().setProperties(this.getOutput());
}
}
public void computeDataType() {
_dataType = ((_dim1 == 0) && (_dim2 == 0)) ?
DataType.SCALAR : ((_dim1 >= 1) || (_dim2 >= 1)) ?
DataType.MATRIX : DataType.UNKNOWN;
}
public void setBooleanProperties(){
_dataType = DataType.SCALAR;
_valueType = ValueType.BOOLEAN;
_dim1 = 0;
_dim2 = 0;
_blocksize = 0;
_nnz = -1;
_format = null;
}
public void setIntProperties(){
_dataType = DataType.SCALAR;
_valueType = ValueType.INT64;
_dim1 = 0;
_dim2 = 0;
_blocksize = 0;
_nnz = -1;
_format = null;
}
public boolean isScalarBoolean(){
return (_valueType == ValueType.BOOLEAN) && (_dataType == DataType.SCALAR);
}
public boolean dimsKnown(){
return ( _dim1 >= 0 && _dim2 >= 0);
}
}