<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # Cassandra CQL 解釋器 原文鏈接 : [http://zeppelin.apache.org/docs/0.7.2/interpreter/cassandra.html](http://zeppelin.apache.org/docs/0.7.2/interpreter/cassandra.html) 譯文鏈接 : [http://www.apache.wiki/pages/viewpage.action?pageId=10030777](http://www.apache.wiki/pages/viewpage.action?pageId=10030777) 貢獻者 : [片刻](/display/~jiangzhonglian) [ApacheCN](/display/~apachecn) [Apache中文網](/display/~apachechina) | Name | Class | Description | | --- | --- | --- | | %cassandra | CassandraInterpreter | 為Apache Cassandra CQL查詢語言提供解釋器 | ## 啟用Cassandra解釋器 在筆記本中,要啟用**Cassandra**解釋器,請單擊**Gear**圖標并選擇**Cassandra。** ![](https://img.kancloud.cn/46/13/4613ca6bdb01f11fe8a02ed24ebc4988_378x418.jpg) ## 使用Cassandra解釋器 在段落中,使用**_%cassandra_**來選擇**Cassandra**解釋器,然后輸入所有命令。 要訪問交互式幫助,請鍵入**HELP;** ![](https://img.kancloud.cn/a5/bb/a5bbc807480fc789d998bf15aabc6b2f_566x553.jpg) ## 解釋器命令 所述Cassandra解釋器接受下列命令 | Command Type | Command Name | Description | | --- | --- | --- | | Help command | HELP | 顯示交互式幫助菜單 | | Schema commands | DESCRIBE KEYSPACE, DESCRIBE CLUSTER, DESCRIBE TABLES ... | 描述Cassandra模式的自定義命令 | | Option commands | @consistency, @retryPolicy, @fetchSize ... | 將運行時選項注入段落中的所有語句 | | Prepared statement commands | @prepare, @bind, @remove_prepared | 讓您注冊一個準備好的命令,并通過注入綁定值重新使用它 | | Native CQL statements | All CQL-compatible statements (SELECT, INSERT, CREATE ...) | 所有CQL語句都直接針對Cassandra服務器執行 | ## CQL語句 該解釋器與Cassandra支持的任何CQL語句兼容。例如: ``` INSERT INTO users(login,name) VALUES('jdoe','John DOE'); SELECT * FROM users WHERE login='jdoe';? ``` 除了以下特殊命令之外,每個語句都應以分號(**;**)分隔: 1. @準備 2. @bind 3. @remove_prepare 4. @一致性 5. @serialConsistency 6. @timestamp 7. @retryPolicy 8. @fetchSize 9. @請求超時 只要它們以分號分隔,就支持多行語句以及同一行上的多個語句。例如: ``` USE spark_demo; SELECT * FROM albums_by_country LIMIT 1; SELECT * FROM countries LIMIT 1; SELECT * FROM artists WHERE login='jlennon';? ``` 支持批處理語句,可以跨多行,以及DDL(CREATE / ALTER / DROP)語句: ``` BEGIN BATCH INSERT INTO users(login,name) VALUES('jdoe','John DOE'); INSERT INTO users_preferences(login,account_type) VALUES('jdoe','BASIC'); APPLY BATCH; CREATE TABLE IF NOT EXISTS test( key int PRIMARY KEY, value text );? ``` CQL語句不**區分大小寫**(列名和值除外)。這意味著以下語句是等同和有效的: ``` INSERT INTO users(login,name) VALUES('jdoe','John DOE'); Insert into users(login,name) vAlues('hsue','Helen SUE');? ``` 所有CQL語句和版本的完整列表如下: | Cassandra版本 | 文件鏈接 | | --- | --- | | **3.X** | [http://docs.datastax.com/en/cql/3.3/cql/cqlIntro.html](http://docs.datastax.com/en/cql/3.3/cql/cqlIntro.html) | | **2.2** | [http://docs.datastax.com/en/cql/3.3/cql/cqlIntro.html](http://docs.datastax.com/en/cql/3.3/cql/cqlIntro.html) | | **2.1&2.0** | [http://docs.datastax.com/en/cql/3.1/cql/cql?_intro_?c.html](http://docs.datastax.com/en/cql/3.1/cql/cql_intro_c.html) | | **1.2** | [http://docs.datastax.com/en/cql/3.0/cql/aboutCQL.html](http://docs.datastax.com/en/cql/3.0/cql/aboutCQL.html) | ## 聲明中的評論 可以在語句之間添加注釋。單行注釋以**哈希符號**(#)或**雙斜杠**(//)開頭。多行注釋在/ **和** /之間。例如: ``` #Single line comment style 1 INSERT INTO users(login,name) VALUES('jdoe','John DOE'); //Single line comment style 2 /** Multi line comments **/ Insert into users(login,name) vAlues('hsue','Helen SUE');? ``` ## 語法驗證 解釋器隨附了一個內置的語法驗證器。此驗證器僅檢查基本語法錯誤。 所有與CQL相關的語法驗證都直接**委托**給**Cassandra** 大多數情況下,語法錯誤是由于語句或**打字錯誤**之間**的分號丟失**造成的。 ## 模式命令 為了使模式發現更容易和更具交互性,支持以下命令: | 命令 | 描述 | | --- | --- | | **DESCRIBE CLUSTER;** | 顯示當前的群集名稱及其分區 | | **DESCRIBE KEYSPACES;** | 列出集群中的所有現有密鑰空間及其配置(復制因子,持久寫入...) | | **DESCRIBE TABLES;** | 列出集群中的所有現有密鑰空間,并列出所有表的名稱 | | **DESCRIBE TYPES;** | 列出集群中的所有現有密鑰空間,并列出所有用戶定義的類型名稱 | | **DESCRIBE FUNCTIONS;** | 列出集群中的所有現有鍵空間,并列出所有函數的名稱 | | **DESCRIBE AGGREGATES;** | 列出集群中的所有現有密鑰空間,并列出所有聚合名稱 | | **DESCRIBE MATERIALIZED VIEWS;** | 列出集群中的所有現有密鑰空間,并列出所有實例化視圖名稱 | | **DESCRIBE KEYSPACE &lt;keyspace_name&gt;;_** | 描述給定的密鑰空間配置及其所有表的詳細信息(名稱,列,...) | | **DESCRIBE TABLE (&lt;keyspacename&gt;).&lt;table_name&gt;;_** | 描述給定的表。如果沒有提供密鑰空間,則使用當前登錄的密鑰空間。如果沒有登錄密鑰空間,則使用默認系統密鑰空間。如果沒有找到表,會出現錯誤信息 | | **DESCRIBE TYPE (&lt;keyspacename&gt;).&lt;type_name&gt;;_** | 描述給定類型(UDT)。如果沒有提供密鑰空間,則使用當前登錄的密鑰空間。如果沒有登錄密鑰空間,則使用默認系統密鑰空間。如果沒有找到類型,會出現錯誤信息 | | **DESCRIBE FUNCTION (&lt;keyspacename&gt;).&lt;function_name&gt;;_** | 描述給定的功能。如果沒有提供密鑰空間,則使用當前登錄的密鑰空間。如果沒有登錄密鑰空間,則使用默認系統密鑰空間。如果沒有找到功能,則會出現錯誤信息 | | **DESCRIBE AGGREGATE (&lt;keyspacename&gt;).&lt;aggregate_name&gt;;_** | 描述給定的聚合。如果沒有提供密鑰空間,則使用當前登錄的密鑰空間。如果沒有登錄密鑰空間,則使用默認系統密鑰空間。如果沒有找到聚合,則會出現錯誤消息 | | **DESCRIBE MATERIALIZED VIEW (&lt;keyspacename&gt;).&lt;view_name&gt;;** | 描述給定的視圖。如果沒有提供密鑰空間,則使用當前登錄的密鑰空間。如果沒有登錄密鑰空間,則使用默認系統密鑰空間。如果沒有找到任何視圖,會出現錯誤信息 | 模式對象(集群,密鑰空間,表,類型,功能和聚合)以表格格式顯示。左上角有一個下拉菜單來展開對象細節。右上角的菜單顯示“圖標”圖標。 ![](https://img.kancloud.cn/8f/6b/8f6b118acdecc59773fc87106461685c_566x241.jpg) ## 運行時參數 有時您希望能夠將運行時查詢參數傳遞給您的語句。 這些參數不是CQL規范的一部分,而是特定于解釋器。 以下是所有參數的列表: | 參數 | 語法 | 描述 | | --- | --- | --- | | Consistency Level | **@consistency=_value_** | 將給定的一致性級別應用于段落中的所有查詢 | | Serial Consistency Level | **@serialConsistency=_value_** | 將給定的串行一致性級別應用于段落中的所有查詢 | | Timestamp | **@timestamp=_long value_** | 將給定的時間戳應用于段落中的所有查詢。請注意,直接在CQL語句中傳遞的時間戳值將覆蓋此值 | | Retry Policy | **@retryPolicy=_value_** | 將給定的重試策略應用于段落中的所有查詢 | | Fetch Size | **@fetchSize=_integer value_** | 將給定的提取大小應用于段落中的所有查詢 | | Request Time Out | **@requestTimeOut=_integer value_** | 將給定的請求超時**以毫秒**為**單位應用于段落**中的所有查詢 | 一些參數僅接受限制值: | 參數 | 可能的值 | | --- | --- | | Consistency Level | **ALL, ANY, ONE, TWO, THREE, QUORUM, LOCAL_ONE, LOCAL_QUORUM, EACH_QUORUM_** | | Serial Consistency Level | **SERIAL, LOCALSERIAL** | | Timestamp | Any long value | | Retry Policy | **DEFAULT, DOWNGRADING_CONSISTENCY, FALLTHROUGH, LOGGING_DEFAULT, LOGGING_DOWNGRADING, LOGGING_FALLTHROUGH** | | Fetch Size | Any integer value | > 請注意,您應該**不**加分號(**;**在每個參數語句的結束) 一些例子: ``` CREATE TABLE IF NOT EXISTS spark_demo.ts( key int PRIMARY KEY, value text ); TRUNCATE spark_demo.ts; // Timestamp in the past @timestamp=10 // Force timestamp directly in the first insert INSERT INTO spark_demo.ts(key,value) VALUES(1,'first insert') USING TIMESTAMP 100; // Select some data to make the clock turn SELECT * FROM spark_demo.albums LIMIT 100; // Now insert using the timestamp parameter set at the beginning(10) INSERT INTO spark_demo.ts(key,value) VALUES(1,'second insert'); // Check for the result. You should see 'first insert' SELECT value FROM spark_demo.ts WHERE key=1;? ``` 有關查詢參數的一些注釋: > 1. **許多**查詢參數可以在同一段落中設置 > 2. 如果**相同的**查詢參數用不同的值設置很多時間,則解釋器僅考慮第一個值 > 3. 每個查詢參數都適用于同一**段落**中的**所有CQL語句**,除非您使用純CQL文本覆蓋選項(如強制使用USING子句的時間戳) > 4. 關于CQL語句的每個查詢參數的順序并不重要 ## 支持準備聲明 出于性能原因,最好先準備語句,然后通過提供綁定值重用它們。 此解釋器提供3個命令來處理準備和綁定的語句: 1. **@prepare** 2. **@bind** 3. **@remove_prepared** 例: ``` @prepare[statement-name]=... @bind[statement-name]=’text’, 1223, ’2015-07-30 12:00:01’, null, true, [‘list_item1’, ’list_item2’] @bind[statement-name-with-no-bound-value] @remove_prepare[statement-name]? ``` #### @prepare 您可以使用語法_“@prepare [statement-name] = SELECT ...”_來創建一個準備好的語句。該_語句名_是**強制性的**,因為翻譯準備與Java驅動程序給定的語句,并在保存生成的準備語句**內部哈希表**,使用所提供的_語句名_作為搜索關鍵字。 > 請注意,內部準備的語句映射與**所有筆記本**和**所有段落**共享,因為**Cassandra**只有一個解釋器實例 > > 如果解釋器遇到**相同的****_statement-name_****(key)的****許多**?@prepare,那么只有**第一個**語句才會被考慮。 例: ``` @prepare[select]=SELECT * FROM spark_demo.albums LIMIT ? @prepare[select]=SELECT * FROM spark_demo.artists LIMIT ? ? ``` 對于上述示例,準備好的語句是`SELECT * FROM spark_demo.albums LIMIT ?`。`SELECT * FROM spark_demo.artists LIMIT?被忽略,因為已準備好的語句映射中已經存在一個條目,帶有key select。 在**Zeppelin**的背景下,筆記本可以定期執行,因此有必要**避免重新準備許多時間相同的聲明(被認為是反模式)**。 #### [@bind](http://zeppelin.apache.org/docs/0.7.1/interpreter/cassandra.html#bind) 一旦準備好聲明(可能在分開的筆記本/段落中)。您可以將值綁定到它: ``` @bind[select_first]=10? ``` 綁定值不是@bind語句的**強制**值。但是,如果您提供綁定值,則需要遵守一些語法:? * 字符串值應包含在簡單引號(')之間 * 日期值應包含在簡單引號(')之間,并遵循格式: 1. yyyy-MM-dd HH:MM:ss 2. yyyy-MM-dd HH:MM:ss.SSS * **null**按原樣解析 * **布爾值**(true | false)按原樣解析 * 集合值必須遵循**[標準的CQL語法](http://docs.datastax.com/en/cql/3.1/cql/cql_using/use_collections_c.html)**: * 列表:['list?_item1','list_?item2',...] * 設置:{'set?_item1','set_?item2',...} * map:{'key1':'val1','key2':'val2',...} * **元組**值應該在括號之間(見**[元組CQL語法](http://docs.datastax.com/en/cql/3.1/cql/cql_reference/tupleType.html)**):('text',123,true) * **udt**值應該在括號之間(見**[UDT CQL語法](http://docs.datastax.com/en/cql/3.1/cql/cql_using/cqlUseUDT.html)**):{stree?_name:'Beverly Hills',number:104,郵編_:90020,state:'California',...} > 可以在批處理中使用@bind語句: > > ``` > BEGIN BATCH > @bind[insert_user]='jdoe','John DOE' > UPDATE users SET age = 27 WHERE login='hsue'; > APPLY BATCH;? > ``` #### [@remove_prepare](http://zeppelin.apache.org/docs/0.7.1/interpreter/cassandra.html#remove_prepare) ``` 為了避免準備好的語句永遠保留在準備好的語句映射中,您可以使用?@remove_prepare [statement-name]語法將其刪除。刪除不存在的準備語句不會產生錯誤。 ``` ## 使用動態表單 而不是對CQL查詢進行硬編碼,可以使用**[Zeppelin動態表單](http://zeppelin.apache.org/docs/0.6.0-SNAPSHOT/manual/dynamicform.html)**語法注入簡單的值或多個選擇表單。 仍然支持綁定輸入文本和選擇表單的舊式胡須語法(**{{}}**),但不推薦使用,并在將來的版本中將其刪除。 > **傳統**?簡單參數的語法是:**{{input_Label = default value}}**。默認值是強制性的,因為第一次執行該段落,我們在呈現表單之前啟動CQL查詢,因此應提供至少一個值。 > > 多選擇參數的語法是:**{{input_Label = value1 |?value2 |?... |?valueN}}**。默認情況下,第一次執行該段落時,首選用于CQL查詢。 例: ``` #Secondary index on performer style SELECT name, country, performer FROM spark_demo.performers WHERE name='${performer=Sheryl Crow|Doof|Fanfarlo|Los Paranoia}' AND styles CONTAINS '${style=Rock}'; ? ``` 在上面的例子中,第一個CQL查詢將執行為_performer ='Sheryl Crow'AND style ='Rock'_。對于后續查詢,您可以使用表單直接更改值。 > 請注意,我們在簡單引號(**'**)之間附帶了**$ {}**塊,因為Cassandra希望有一個String。我們也可以使用**$ {style ='Rock'}**語法,但這次,表單上顯示的值是**_“Rock”_**而不是**_Rock_**。 也可以使用動態表單來**準備語句**: ``` @bind[select]=='${performer=Sheryl Crow|Doof|Fanfarlo|Los Paranoia}', '${style=Rock}'? ``` ## 共享狀態 可以并行執行許多段落。但是,在后端,我們仍然使用同步查詢。?只有當有可能返回值時,_異步執行_才是可能`Future`的`InterpreterResult`。這可能是**Zeppelin**項目的一個有趣的建議。 最近,**Zeppelin**允許您選擇解釋員的隔離級別(請參閱**[解釋器綁定模式](http://zeppelin.apache.org/docs/0.6.0-SNAPSHOT/manual/interpreters.html)**)。 長篇小說,你有3個可用的綁定: * **shared**:_相同的JVM_和所有注釋的_相同的解釋器實例_? * **范圍**:_相同的JVM_但_不同的解釋器實例_,每個音符一個 * **隔離**:_不同的JVM_運行_單個解釋器實例_,每個音符一個JVM 使用**共享**綁定,**所有**注釋和段落`com.datastax.driver.core.Session`都使用相同的對象。因此,如果您使用**USE?****_密鑰空間名稱_****?;?**聲明登錄到一個密鑰空間,它會更改密鑰空間?**所有當前用戶**的的**卡桑德拉**解釋,因為我們只能創造1個%的實例對象**卡桑德拉**解釋。????`com.datastax.driver.core.Session`?? 同樣的說法也適用于**準備好的語句哈希映射**,它由**所有**使用**Cassandra**解釋器的實例共享。 當使用**作用域**綁定時,在_同一個JVM中,_?**Zeppelin**將創建Cassandra解釋器的多個實例,從而創建多個`com.datastax.driver.core.Session`對象。**小心使用這種綁定的資源和內存使用!** 所述**分離的**模式是最極端的,并且將創建許多JVM /?`com.datastax.driver.core.Session`因為有不同的筆記對象。 ## 解釋器配置 要配置**Cassandra**解釋器,請轉到**解釋器**菜單,向下滾動以更改參數。該**卡珊德拉**解釋器使用的是官方**[卡桑德拉Java驅動程序](https://github.com/datastax/java-driver)**和大多數參數都用于配置Java驅動程序 以下是配置參數及其默認值。 | 屬性名稱 | 描述 | 默認值 | | --- | --- | --- | | cassandra.cluster | 要連接的Cassandra群集的名稱 | Test Cluster | | cassandra.compression.protocol | 在線壓縮?可能的值為:NONE,SNAPPY,LZ4 | NONE | | cassandra.credentials.username | 如果啟用安全性,請提供登錄 | none | | cassandra.credentials.password | 如果啟用安全性,請提供密碼 | none | | cassandra.hosts | 逗號分隔Cassandra主機(DNS名稱或IP地址)。? 例如:'192.168.0.12,node2,node3' | localhost | | cassandra.interpreter.parallelism | 可執行的并發段數(查詢塊)數 | 10 | | cassandra.keyspace | 要連接的默認鍵盤空間。**強烈建議讓默認值在表名前加上所有查詢中的實際鍵空格** | system | | cassandra.load.balancing.policy | 負載均衡策略。Default =?_new TokenAwarePolicy(new DCAwareRoundRobinPolicy())_??要指定您自己的策略,請提供您的策略的**完全限定類名(FQCN)**。在運行時,解釋器將使用**Class.forName(FQCN)**實例化策略,? | DEFAULT | | cassandra.max.schema.agreement.wait.second | Cassandra max模式協議等待第二 | 10 | | cassandra.pooling.core.connection.per.host.local | 協議V2及以下default = 2.協議V3及以上default = 1 | 2 | | cassandra.pooling.core.connection.per.host.remote | 協議V2及以下default = 1.協議V3及以上default = 1 | 1 | | cassandra.pooling.heartbeat.interval.seconds | 卡桑德拉泳池心跳間隔(秒) | 30 | | cassandra.pooling.idle.timeout.seconds | Cassandra空閑時間在幾秒鐘內 | 120 | | cassandra.pooling.max.connection.per.host.local | Protocol V2及以下default = 8.協議V3及以上default = 1 | 8 | | cassandra.pooling.max.connection.per.host.remote | 協議V2及以下default = 2.協議V3及以上default = 1 | 2 | | cassandra.pooling.max.request.per.connection.local | 協議V2及以下默認值= 128.協議V3及以上默認值= 1024 | 128 | | cassandra.pooling.max.request.per.connection.remote | 協議V2及以下默認值= 128.協議V3及以上默認值= 256 | 128 | | cassandra.pooling.new.connection.threshold.local | 協議V2及以下默認值= 100.協議V3及以上默認= 800 | 100 | | cassandra.pooling.new.connection.threshold.remote | 協議V2及以下默認值= 100.協議V3及以上default = 200 | 100 | | cassandra.pooling.pool.timeout.millisecs | Cassandra游泳池以毫秒為單位超時 | 5000 | | cassandra.protocol.version | Cassandra二進制協議版本 | 4 | | cassandra.query.default.consistency | Cassandra查詢默認一致性級別? 可用值:ONE,TWO,THREE,QUORUM,LOCAL?_ONE,LOCAL_?QUORUM,EACH?_QUORUM,ALL_ | ONE | | cassandra.query.default.fetchSize | Cassandra查詢默認提取大小 | 5000 | | cassandra.query.default.serial.consistency | Cassandra查詢默認串行一致性級別? 可用值:SERIAL,LOCALSERIAL | SERIAL | | cassandra.reconnection.policy | Cassandra重新連接政策。Default = new ExponentialReconnectionPolicy(1000, 10 * 60 * 1000)?要指定自己的策略,請提供策略的**完全限定類名(FQCN)**。在運行時,解釋器將使用**Class.forName(FQCN)**實例化策略,? | DEFAULT | | cassandra.retry.policy | Cassandra重試政策?Default = DefaultRetryPolicy.INSTANCE要指定您自己的策略,請提供您的策略的**完全限定類名(FQCN)**。在運行時,解釋器將使用**Class.forName(FQCN)**實例化策略,? | DEFAULT | | cassandra.socket.connection.timeout.millisecs | Cassandra套接字默認連接超時(毫秒) | 500 | | cassandra.socket.read.timeout.millisecs | Cassandra套接字以毫秒為單位讀取超時 | 12000 | | cassandra.socket.tcp.no_delay | Cassandra套接字TCP沒有延遲 | true | | cassandra.speculative.execution.policy | Cassandra投機執行政策?Default = NoSpeculativeExecutionPolicy.INSTANCE要指定您自己的策略,請提供策略的**完全限定類名(FQCN)**。在運行時,解釋器將使用**Class.forName(FQCN)**實例化策略。 | DEFAULT | ## 更改日志 **3.0?**_(Zeppelin 0.7.1)_: * 更新文檔 * 更新交互式文檔 * 添加對二進制協議**V4的**支持 * 實現新的`@requestTimeOut`運行時選項 * 將Java驅動程序版本升級到**3.0.1** * 允許解釋器在使用FormType.SIMPLE時以編程方式添加動態表單 * 允許動態窗體使用默認的Zeppelin語法 * 在FallThroughPolicy上修正打字錯誤 * 在創建動態表單之前,請先查看AngularObjectRegistry中的數據 * 添加缺少的`ALTER`語句支持 **2.0?**_(Zeppelin 0.7.1)_: * 更新幫助菜單并添加更改日志 * 添加對**用戶定義函數**,**用戶定義的聚合**和**物化視圖的支持** * 將Java驅動程序版本升級到**3.0.0-rc1** **1.0?**_(Zeppelin 0.5.5-孵育)_: * 初始版本 ## 錯誤和聯系人 如果您遇到這個解釋器的錯誤,請在**[@doanduyhai](https://twitter.com/doanduyhai)**創建一個**[JIRA](https://issues.apache.org/jira/browse/ZEPPELIN-382?jql=project%20%3D%20ZEPPELIN)**票,并在Twitter上**[打我一下](https://twitter.com/doanduyhai)。**
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看