Example #1
0
 @Override
 public void accept(BsonReader reader) {
   reader.readStartArray();
   while (reader.readBsonType() != BsonType.END_OF_DOCUMENT) {
     BsonSkipper.valueOf(reader.getCurrentBsonType().name()).accept(reader);
   }
   reader.readEndArray();
 }
 public void write(ComplexWriter writer, BsonReader reader) throws IOException {
   reader.readStartDocument();
   BsonType readBsonType = reader.getCurrentBsonType();
   switch (readBsonType) {
     case DOCUMENT:
       writeToListOrMap(reader, new MapOrListWriterImpl(writer.rootAsMap()), false, null);
       break;
     default:
       throw new DrillRuntimeException(
           "Root object must be DOCUMENT type. Found: " + readBsonType);
   }
 }
 private Object readValue(final BsonReader reader, final DecoderContext decoderContext) {
   BsonType bsonType = reader.getCurrentBsonType();
   if (bsonType == BsonType.NULL) {
     reader.readNull();
     return null;
   } else if (bsonType == BsonType.ARRAY) {
     return readList(reader, decoderContext);
   } else if (bsonType == BsonType.BINARY) {
     byte bsonSubType = reader.peekBinarySubType();
     if (bsonSubType == BsonBinarySubType.UUID_STANDARD.getValue()
         || bsonSubType == BsonBinarySubType.UUID_LEGACY.getValue()) {
       return registry.get(UUID.class).decode(reader, decoderContext);
     }
   }
   return valueTransformer.transform(
       registry.get(bsonTypeClassMap.get(bsonType)).decode(reader, decoderContext));
 }
 private void writeToListOrMap(
     BsonReader reader, final MapOrListWriterImpl writer, boolean isList, String fieldName) {
   writer.start();
   // If isList is true, then filedName can be null as it is not required while
   // writing
   while (reader.readBsonType() != BsonType.END_OF_DOCUMENT) {
     if (!isList) {
       fieldName = reader.readName();
     }
     BsonType currentBsonType = reader.getCurrentBsonType();
     switch (currentBsonType) {
       case INT32:
         int readInt32 = reader.readInt32();
         if (readNumbersAsDouble) {
           writeDouble(readInt32, writer, fieldName, isList);
         } else {
           writeInt32(readInt32, writer, fieldName, isList);
         }
         atLeastOneWrite = true;
         break;
       case INT64:
         long readInt64 = reader.readInt64();
         if (readNumbersAsDouble) {
           writeDouble(readInt64, writer, fieldName, isList);
         } else {
           writeInt64(readInt64, writer, fieldName, isList);
         }
         atLeastOneWrite = true;
         break;
       case ARRAY:
         reader.readStartArray();
         writeToListOrMap(reader, (MapOrListWriterImpl) writer.list(fieldName), true, fieldName);
         atLeastOneWrite = true;
         break;
       case BINARY:
         // handle types
         writeBinary(reader, writer, fieldName, isList);
         atLeastOneWrite = true;
         break;
       case BOOLEAN:
         boolean readBoolean = reader.readBoolean();
         writeBoolean(readBoolean, writer, fieldName, isList);
         atLeastOneWrite = true;
         break;
       case DATE_TIME:
         long readDateTime = reader.readDateTime();
         writeDateTime(readDateTime, writer, fieldName, isList);
         atLeastOneWrite = true;
         break;
       case DOCUMENT:
         reader.readStartDocument();
         // To handle nested Documents.
         MapOrListWriterImpl _writer = writer;
         if (!isList) {
           _writer = (MapOrListWriterImpl) writer.map(fieldName);
         } else {
           _writer = (MapOrListWriterImpl) writer.listoftmap(fieldName);
         }
         writeToListOrMap(reader, _writer, false, fieldName);
         atLeastOneWrite = true;
         break;
       case DOUBLE:
         double readDouble = reader.readDouble();
         writeDouble(readDouble, writer, fieldName, isList);
         atLeastOneWrite = true;
         break;
       case JAVASCRIPT:
         final String readJavaScript = reader.readJavaScript();
         writeString(readJavaScript, writer, fieldName, isList);
         atLeastOneWrite = true;
         break;
       case JAVASCRIPT_WITH_SCOPE:
         final String readJavaScriptWithScopeString = reader.readJavaScriptWithScope();
         writeString(readJavaScriptWithScopeString, writer, fieldName, isList);
         atLeastOneWrite = true;
         break;
       case NULL:
         // just read and ignore.
         reader.readNull();
         break;
       case OBJECT_ID:
         writeObjectId(reader, writer, fieldName, isList);
         atLeastOneWrite = true;
         break;
       case STRING:
         final String readString = reader.readString();
         writeString(readString, writer, fieldName, isList);
         atLeastOneWrite = true;
         break;
       case SYMBOL:
         final String readSymbol = reader.readSymbol();
         writeString(readSymbol, writer, fieldName, isList);
         atLeastOneWrite = true;
         break;
       case TIMESTAMP:
         int time = reader.readTimestamp().getTime();
         writeTimeStamp(time, writer, fieldName, isList);
         atLeastOneWrite = true;
         break;
       default:
         // Didn't handled REGULAR_EXPRESSION and DB_POINTER types
         throw new DrillRuntimeException("UnSupported Bson type: " + currentBsonType);
     }
   }
   if (!isList) {
     reader.readEndDocument();
   } else {
     reader.readEndArray();
   }
 }
 /**
  * This method may be overridden to change the behavior of reading the current value from the
  * given {@code BsonReader}. It is required that the value be fully consumed before returning.
  *
  * @param reader the read to read the value from
  * @param decoderContext the context
  * @return the non-null value read from the reader
  */
 protected BsonValue readValue(final BsonReader reader, final DecoderContext decoderContext) {
   return codecRegistry
       .get(BsonValueCodecProvider.getClassForBsonType(reader.getCurrentBsonType()))
       .decode(reader, decoderContext);
 }
Example #6
0
 public static void skipValue(BsonReader reader) {
   BsonSkipper.valueOf(reader.getCurrentBsonType().name()).accept(reader);
 }