All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.torodb.kvdocument.conversion.mongowp.FromBsonValueTranslator Maven / Gradle / Ivy

The newest version!
/*
 * ToroDB
 * Copyright © 2014 8Kdata Technology (www.8kdata.com)
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program. If not, see .
 */

package com.torodb.kvdocument.conversion.mongowp;

import com.torodb.kvdocument.conversion.mongowp.values.BsonKvString;
import com.torodb.kvdocument.values.KvBinary.KvBinarySubtype;
import com.torodb.kvdocument.values.KvBoolean;
import com.torodb.kvdocument.values.KvDecimal128;
import com.torodb.kvdocument.values.KvDeprecated;
import com.torodb.kvdocument.values.KvDocument;
import com.torodb.kvdocument.values.KvDouble;
import com.torodb.kvdocument.values.KvInteger;
import com.torodb.kvdocument.values.KvLong;
import com.torodb.kvdocument.values.KvMaxKey;
import com.torodb.kvdocument.values.KvMinKey;
import com.torodb.kvdocument.values.KvMongoDbPointer;
import com.torodb.kvdocument.values.KvMongoJavascript;
import com.torodb.kvdocument.values.KvMongoJavascriptWithScope;
import com.torodb.kvdocument.values.KvMongoObjectId;
import com.torodb.kvdocument.values.KvMongoRegex;
import com.torodb.kvdocument.values.KvNull;
import com.torodb.kvdocument.values.KvUndefined;
import com.torodb.kvdocument.values.KvValue;
import com.torodb.kvdocument.values.heap.ByteArrayKvMongoObjectId;
import com.torodb.kvdocument.values.heap.ByteSourceKvBinary;
import com.torodb.kvdocument.values.heap.DefaultKvMongoTimestamp;
import com.torodb.kvdocument.values.heap.InstantKvInstant;
import com.torodb.kvdocument.values.heap.LongKvInstant;
import com.torodb.mongowp.bson.BsonArray;
import com.torodb.mongowp.bson.BsonBinary;
import com.torodb.mongowp.bson.BsonBoolean;
import com.torodb.mongowp.bson.BsonDateTime;
import com.torodb.mongowp.bson.BsonDbPointer;
import com.torodb.mongowp.bson.BsonDecimal128;
import com.torodb.mongowp.bson.BsonDeprecated;
import com.torodb.mongowp.bson.BsonDocument;
import com.torodb.mongowp.bson.BsonDouble;
import com.torodb.mongowp.bson.BsonInt32;
import com.torodb.mongowp.bson.BsonInt64;
import com.torodb.mongowp.bson.BsonJavaScript;
import com.torodb.mongowp.bson.BsonJavaScriptWithScope;
import com.torodb.mongowp.bson.BsonMax;
import com.torodb.mongowp.bson.BsonMin;
import com.torodb.mongowp.bson.BsonNull;
import com.torodb.mongowp.bson.BsonObjectId;
import com.torodb.mongowp.bson.BsonRegex;
import com.torodb.mongowp.bson.BsonString;
import com.torodb.mongowp.bson.BsonTimestamp;
import com.torodb.mongowp.bson.BsonUndefined;
import com.torodb.mongowp.bson.BsonValue;
import com.torodb.mongowp.bson.BsonValueVisitor;
import com.torodb.mongowp.bson.impl.InstantBsonDateTime;

import java.util.function.Function;

public class FromBsonValueTranslator
    implements BsonValueVisitor, Void>, Function, KvValue> {

  private FromBsonValueTranslator() {}

  public static FromBsonValueTranslator getInstance() {
    return FromBsonValueTranslatorHolder.INSTANCE;
  }

  @Override
  public KvValue apply(BsonValue bsonValue) {
    return bsonValue.accept(this, null);
  }

  @Override
  public KvValue visit(BsonArray value, Void arg) {
    return MongoWpConverter.toEagerArray(value);
  }

  @Override
  public KvValue visit(BsonBinary value, Void arg) {
    KvBinarySubtype subtype;
    switch (value.getSubtype()) {
      case FUNCTION:
        subtype = KvBinarySubtype.MONGO_FUNCTION;
        break;
      case GENERIC:
        subtype = KvBinarySubtype.MONGO_GENERIC;
        break;
      case MD5:
        subtype = KvBinarySubtype.MONGO_MD5;
        break;
      case OLD_BINARY:
        subtype = KvBinarySubtype.MONGO_OLD_BINARY;
        break;
      case OLD_UUID:
        subtype = KvBinarySubtype.MONGO_OLD_UUID;
        break;
      case USER_DEFINED:
        subtype = KvBinarySubtype.MONGO_USER_DEFINED;
        break;
      case UUID:
        subtype = KvBinarySubtype.MONGO_UUID;
        break;
      default:
        subtype = KvBinarySubtype.UNDEFINED;
        break;
    }
    return new ByteSourceKvBinary(
        subtype, value.getNumericSubType(), value.getByteSource().getDelegate());
  }

  @Override
  public KvValue visit(BsonDbPointer value, Void arg) {
    return KvMongoDbPointer.of(value.getNamespace(), (KvMongoObjectId) visit(value.getId(), arg));
  }

  @Override
  public KvValue visit(BsonDateTime value, Void arg) {
    if (value instanceof InstantBsonDateTime) {
      return new InstantKvInstant(value.getValue());
    }
    return new LongKvInstant(value.getMillisFromUnix());
  }

  @Override
  public KvValue visit(BsonDocument value, Void arg) {
    return MongoWpConverter.toEagerDocument(value);
  }

  @Override
  public KvValue visit(BsonDouble value, Void arg) {
    return KvDouble.of(value.doubleValue());
  }

  @Override
  public KvValue visit(BsonInt32 value, Void arg) {
    return KvInteger.of(value.intValue());
  }

  @Override
  public KvValue visit(BsonInt64 value, Void arg) {
    return KvLong.of(value.longValue());
  }

  @Override
  public KvValue visit(BsonBoolean value, Void arg) {
    if (value.getPrimitiveValue()) {
      return KvBoolean.TRUE;
    }
    return KvBoolean.FALSE;
  }

  @Override
  public KvValue visit(BsonJavaScript value, Void arg) {
    return KvMongoJavascript.of(value.getValue());
  }

  @Override
  public KvValue visit(BsonJavaScriptWithScope value, Void arg) {
    return KvMongoJavascriptWithScope.of(
        value.getJavaScript(), (KvDocument) visit(value.getScope(), arg));
  }

  @Override
  public KvValue visit(BsonMax value, Void arg) {
    return KvMaxKey.getInstance();
  }

  @Override
  public KvValue visit(BsonMin value, Void arg) {
    return KvMinKey.getInstance();
  }

  @Override
  public KvValue visit(BsonNull value, Void arg) {
    return KvNull.getInstance();
  }

  @Override
  public KvValue visit(BsonObjectId value, Void arg) {
    return new ByteArrayKvMongoObjectId(value.toByteArray());
  }

  @Override
  public KvValue visit(BsonRegex value, Void arg) {

    return KvMongoRegex.of(value.getPattern(), value.getOptionsAsText());
  }

  @Override
  public KvValue visit(BsonString value, Void arg) {
    return new BsonKvString(value);
  }

  @Override
  public KvValue visit(BsonUndefined value, Void arg) {
    return KvUndefined.getInstance();
  }

  @Override
  public KvValue visit(BsonTimestamp value, Void arg) {
    return new DefaultKvMongoTimestamp(value.getSecondsSinceEpoch(), value.getOrdinal());
  }

  @Override
  public KvValue visit(BsonDeprecated value, Void arg) {
    return KvDeprecated.of(value.getValue());
  }

  @Override
  public KvValue visit(BsonDecimal128 value, Void arg) {
    return KvDecimal128.of(value.getHigh(), value.getLow());
  }

  private static class FromBsonValueTranslatorHolder {
    private static final FromBsonValueTranslator INSTANCE = new FromBsonValueTranslator();
  }

  //@edu.umd.cs.findbugs.annotations.SuppressFBWarnings(value = "UPM_UNCALLED_PRIVATE_METHOD")
  private Object readResolve() {
    return FromBsonValueTranslator.getInstance();
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy